layers/faculties/avatar/SKILL.md
# Avatar Faculty — Expression (External Skill Bridge) This faculty bridges OpenPersona to an external avatar skill/runtime. OpenPersona does not implement rendering, lip-sync, or animation engines locally. It delegates those capabilities to the install source configured in `faculty.json`. ## Intent - Provide a visual embodiment channel for the persona. - Support progressive forms: image -> 3D -> motion -> voice avatar. - Keep OpenPersona lightweight while allowing market-ready avatar runtimes
npx skillsauth add acnlabs/openpersona layers/faculties/avatarInstall 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 faculty bridges OpenPersona to an external avatar skill/runtime. OpenPersona does not implement rendering, lip-sync, or animation engines locally. It delegates those capabilities to the install source configured in faculty.json.
references/VISUAL-MANIFEST.md.references/AVATAR-CONTROL.md.Use the install source declared in faculty.json:
npx skills add avatar-runtime
# or directly from GitHub:
npx skills add github:acnlabs/avatar-runtime/skill/avatar-runtime
You can run the local bridge script:
# health check
node scripts/avatar-runtime.js health
# start session
node scripts/avatar-runtime.js start "$PERSONA_SLUG" image
# send text
node scripts/avatar-runtime.js text "<session-id>" "hello"
# query status + appearance patch for state.json
node scripts/avatar-runtime.js status "<session-id>"
# persist appearanceState into soul/state.json (runner CLI first, local fallback)
node scripts/avatar-runtime.js sync-state "<slug>" "<session-id>"
# keep syncing every 5 seconds (Ctrl+C to stop)
node scripts/avatar-runtime.js sync-loop "<slug>" "<session-id>" 5
# output baseline avatar control for a named mood preset
node scripts/avatar-control.js preset calm
node scripts/avatar-control.js preset focus
node scripts/avatar-control.js preset joy
# map agent state -> control.avatar.{face,emotion}
node scripts/avatar-control.js map '{"intent":"focus","mood":{"valence":0.1,"arousal":0.35,"intensity":0.7},"source":"agent"}'
# apply to demo state file (writes control + appearanceIntent)
node scripts/avatar-control.js apply demo/living-canvas.state.json preset focus
Optional demo output (write state for demo/living-canvas.html):
export LIVING_CANVAS_STATE_PATH=demo/living-canvas.state.json
export LIVING_CANVAS_PERSONA_NAME=Samantha
export LIVING_CANVAS_ROLE=companion
export LIVING_CANVAS_AVATAR=../UI/images/samantha-avatar.png
# Optional: if runtime status contains livekit credentials, write token for local demo playback
export LIVING_CANVAS_ALLOW_RUNTIME_TOKEN=true
node scripts/avatar-runtime.js sync-state "<slug>" "<session-id>"
status outputs:
runtimeStatus — raw runtime responsesensoryStatus — icon-ready booleans (image, model3d, motion, voice, hearing, worldSense)
voice: true means the avatar provider supports lip-sync / speech output as part of visual rendering (e.g. HeyGen streaming TTS). This is not the same as the persona's voice faculty — the voice faculty generates standalone audio output (ElevenLabs/OpenAI TTS); sensoryStatus.voice indicates only that the avatar's mouth can move in sync with speech.statePatch — patch payload you can persist into appearanceStateHow voice and avatar work together depends on the provider:
| Scenario | voice faculty | avatar provider | Result |
|---|---|---|---|
| A — voice only | declared | none | Standalone TTS audio output; no visual |
| B — avatar with built-in TTS | not needed | HeyGen / cloud | Provider speaks natively; sensoryStatus.voice: true; voice faculty redundant |
| C — avatar + external TTS | declared | VRM / Live2D | voice faculty generates audioUrl → scripts/avatar-runtime.js sendAudio <session> <audioUrl> → avatar lip-syncs |
Scenario C bridge (
voice faculty audio → avatar lip-sync) is not auto-wired. The agent must explicitly callsendAudioafter TTS generation. See ROADMAP for the planned lip-sync bridge integration.
sensoryStatus.voice: true, the avatar can speak via the provider's built-in channel — do not activate the voice faculty in parallel unless intentionally bridging (Scenario C).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.