client-persona-profiler
SkillAI & modelsPost-call persona detection skill. Analyses a CALL-E transcript to classify the caller's behavioural archetype (heuristic DISC keyword scoring), compute an RFMAP-style loyalty score across accumulated call history, persist a privacy-preserving hashed profile, and return a structured persona card with a personalised next-call strategy playbook. Runs in heuristic mode only, with sensitive-topic human-review flags.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the client-persona-profiler skill
What this skill tells your AI
The instructions your AI receives, as published by calle-ai/awesome-phone-call-agents in skills/client-persona-profiler/SKILL.md and read by ahel’s review.
Detect who your caller is — and how to keep them.
Unlock lasting customer relationships by understanding the person behind every call, not just the transaction. This skill profiles caller behaviour across interactions (from transcripts obtained with caller consent), builds a long-term loyalty picture, and hands the agent a concrete, archetype-specific playbook for the next call.
Why This Skill Exists
Most call-centre AI focuses on what the caller wants right now. This skill focuses on who they are — their communication style, their loyalty, and their churn risk — so every subsequent interaction is more effective, more personalised, and more likely to convert a one-time caller into a long-term champion.
Scientific Foundation
The classification is a heuristic, not a validated psychometric instrument:
DISC keyword markers are a design choice and the archetype labels are advisory
only (see references/safety.md).
| Research | Relevance |
|---|---|
| Marston, Emotions of Normal People (1928) — DISC | Four-quadrant behavioural model the keyword library is adapted from; DISC's predictive validity is contested in independent academic literature |
| Persona-DB, arXiv:2402.11060 (COLING 2025) | Persona profile storage and retrieval without fine-tuning; conceptual basis for the per-caller profile store |
| Classic RFM (Recency-Frequency-Monetary) model | Basis of the RFMAP-style loyalty score; weights are a skill design choice |
| arXiv:2411.12539 (Nov 2024) — CSAT from transcripts | Transcript sentiment as a satisfaction/loyalty proxy |
Full citations: references/research-papers.md
Quick Start
Heuristic mode (no external dependencies, no model call)
python3 scripts/profile_caller.py \
--transcript path/to/transcript.json \
--profile-dir /var/call-profiles/ \
--caller-id "+14155550100" \
--dry-run \
--out /tmp/persona_card.json
Validate output schema
python3 scripts/validate_profile.py --card /tmp/persona_card.json
Input
The skill accepts any CALL-E transcript in one of two formats:
Format A — array of turns:
[
{"role": "agent", "text": "Hello, how can I help you today?"},
{"role": "callee", "text": "I need to see all the policy documents first."}
]
Format B — wrapper object:
{
"call_id": "calle-20260915-001",
"transcript": [
{"role": "agent", "text": "Hello, how can I help you today?"},
{"role": "callee", "text": "I need to see all the policy documents first."}
]
}
Supported turn keys: role / speaker, and text / content / message.
Output — Persona Card
{
"caller_token": "sha256:3f9c8e2a1b7d...",
"analysis_timestamp": "2026-09-15T09:00:00Z",
"interaction_count": 5,
"first_seen_days_ago": 42,
"last_seen_days_ago": 3,
"persona_archetype": "Analytical",
"archetype_confidence":"high",
"disc_scores": {
"D": 0.0, "I": 0.0769, "S": 0.0, "C": 0.9231
},
"sentiment_trajectory": ["neutral", "neutral", "neutral"],
"sentiment_trend": "stable",
"rfmap_loyalty_score": 65,
"loyalty_tier": "high_value",
"churn_risk": "medium",
"call_driver": "unknown",
"sensitive_topics": [],
"recommended_playbook": {
"archetype": "Analytical",
"open_with": "Lead with facts, data, and specifics. Reference documented policies.",
"avoid": "Emotional appeals, vague generalisations, premature commitments.",
"close_with": "Offer written confirmation. Give them time to evaluate.",
"loyalty_lever":"Transparency, consistency between what is said and what is delivered.",
"churn_warning":"Discovered discrepancies between promises and reality."
},
"flags": [],
"profile_version": 5,
"analysis_mode": "heuristic",
"dry_run": false,
"schema_version": "1.0"
}
call_driver is always "unknown" in heuristic mode (no intent extraction is
performed); it is kept in the schema for future extensions.
DISC Archetype Reference
| Archetype | Key Trait | Engagement Style |
|---|---|---|
| Dominant (D) | Results-driven, decisive | Direct, brief, outcome-focused |
| Influential (I) | People-oriented, enthusiastic | Story-driven, warm, community-focused |
| Steady (S) | Consistent, supportive | Calm, step-by-step, no surprises |
| Analytical (C) | Detail-oriented, systematic | Data-backed, documented, deliberate |
| Undetermined | Insufficient signal | Balanced, neutral — gather more turns |
RFMAP Loyalty Tiers
| Score | Tier | Churn Risk |
|---|---|---|
| ≥ 80 | Champion | Low |
| 60–79 | High Value | Low / Medium |
| 40–59 | At Risk | Medium |
| < 40 | Low Value | High |
Flags
| Flag | Meaning |
|---|---|
LOW_TURN_COUNT | Fewer than --min-turns turns; archetype is unreliable |
UNDETERMINED_ARCHETYPE | Top two DISC dimensions are within the margin; archetype is Undetermined |
CHURN_RISK_ELEVATED | RFMAP score is below 55 |
REQUIRES_HUMAN_REVIEW | Sensitive subject matter (medical, legal, financial, or emergency keywords) detected in the transcript; the matched topics are listed in sensitive_topics |
Command-Line Reference
usage: profile_caller.py [-h] --transcript TRANSCRIPT
[--profile-dir PROFILE_DIR]
[--caller-id CALLER_ID]
[--playbook PLAYBOOK]
[--min-turns MIN_TURNS]
[--dry-run]
[--out OUT]
options:
--transcript Path to the transcript JSON file (required)
--profile-dir Directory to read/write persistent caller profiles
(default: ./profiles)
--caller-id Explicit caller identity string (hashed before storage)
(default: auto-derived from transcript metadata)
--playbook Path to the DISC playbooks JSON file
(default: references/disc-playbooks.json)
--min-turns Minimum callee turns before emitting an archetype label
(default: 4)
--dry-run Analyse without writing to the profile store
--out Write persona card JSON to this path (default: stdout)
Privacy & Safety
- One-way hashing: The
caller_idis SHA-256 hashed before storage. Raw identity never reaches disk or output. - No PII in output:
validate_profile.pyscans for phone numbers and email addresses and fails if any are found. - Local storage only: Profiles are stored as
.jsonlfiles on the local filesystem. No cloud, no external API. - Protected attributes excluded: Race, ethnicity, religion, political views, and health status are explicitly outside scope.
- Advisory only: The
recommended_playbookis a suggestion, not an automated action. A human decides whether and how to apply it.
Full safety reference: references/safety.md
Files
skills/client-persona-profiler/
├── SKILL.md ← This file
├── scripts/
│ ├── profile_caller.py ← Main analysis runner
│ ├── validate_profile.py ← Output schema validator
│ └── test_persona_profiler.py ← Test suite (84 tests)
└── references/
├── disc-playbooks.json ← Archetype strategy playbooks
├── example-transcript.json ← Sample transcript
├── examples.md ← Usage examples
├── research-papers.md ← Scientific citations
└── safety.md ← Privacy and ethics reference
Running Tests
# Run via pytest (recommended)
python3 -m pytest skills/client-persona-profiler/scripts/test_persona_profiler.py -v
# Or run directly
python3 skills/client-persona-profiler/scripts/test_persona_profiler.py
Expected: all tests pass, zero network calls, zero file writes (dry-run by default).
Integration with CALL-E
In a CALL-E pipeline, invoke this skill as a post-call step:
[call ends] → [transcribe] → [profile_caller.py] → [persona card] → [agent uses playbook on next call]
The persona card can be stored in the agent's context store and injected into the system prompt at the start of the next call:
System: The caller's DISC archetype is Analytical.
Open with data. Avoid emotional appeals. Offer written confirmation.
Signals
- GitHub stars
- 104
- Forks
- 527
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
client-persona-profiler- Source
- github.com/calle-ai/awesome-phone-call-agents