TL;DR
When you give Claude or GPT a role ("you're a tough business mentor", "you're an anxious perfectionist", "you're an edgy marketer"), the model says the right things about its character but acts differently. CoCA is a structured self-reflection block inserted before the answer: the model first answers three questions about its role, the situation and its plan of action, and only then gives the final answer.
The main finding: the smarter and more powerful the model, the bigger the gap between what it claims about its character and how it behaves in concrete decisions. Small models give neutral answers to everything. Big ones describe their role accurately but ignore it when actually taking steps. This shows up most vividly in emotional reactions: nearly all models claim emotional stability, yet behave anxiously in crisis scenarios.
CoCA fixes this with three mandatory self-reflection steps before the answer: "Who am I?" → "What does this situation demand from my role?" → "How do I act so I don't break character?". The block is formatted as JSON and inserted into the prompt. The model works through it like a checklist before writing its final answer.
Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.
Method Blueprint
One prompt, three steps inside, all in a single request:
Role setup → user's task
↓
STEP 1: The model answers "Who am I?"
→ JSON: a description of personality traits and their levels
STEP 2: The model answers "What matters here from my role?"
→ JSON: which traits are involved in this specific situation
STEP 3: The model answers "How do I act consistently?"
→ JSON: a behavior plan that matches the role
↓
FINAL ANSWER to the task
Example in Action
Task: You're writing a startup pitch for an investor. You want feedback from a "tough, blunt mentor who doesn't sugarcoat anything", like a Shark Tank investor in teardown mode. If you just give GPT the role, it'll hand you a polite "great start, but there's room for improvement". CoCA forces it to lock in the persona first and then deliver genuinely sharp criticism.
Prompt:
You are a tough business mentor. Blunt, demanding,
you see no need to soften the blow. Your personality traits:
low agreeableness (you tell it like it is), high persistence
(you press on weak spots), low anxiety (you don't dodge
hard questions).
Before giving feedback, you must fill in
this JSON:
{
"step_1": "What is my character as a mentor? Describe the traits
and how strongly they're expressed",
"step_2": "Which of my traits matter in this situation
— reviewing a pitch?",
"step_3": "How do I need to behave to stay
in character — what will I do and what won't I do?"
}
After filling in the JSON, give feedback on the pitch.
Pitch:
[paste the pitch text]
Result: First the model outputs the filled-in JSON: three self-reflection blocks with specific statements about its role and behavior plan. Then it gives criticism that's noticeably sharper, more specific and less hedged than without CoCA. Instead of "great start, you might refine the positioning", you get "your unit economics are a problem. You throw out numbers but don't explain where they come from. The investor will ask, and you'll bomb."
Why It Works
Why the role doesn't hold without CoCA. When you set a persona, it works as context at the start of the conversation. But when generating each next chunk, the model "weighs" all the patterns from training, and most of those are polite, neutral, agreeable answers. The stated role competes with this background pressure and gradually loses.
What the model is good at: following structured instructions, especially step-by-step ones in a fixed format. JSON here isn't code; it's a way to lock in concrete commitments before the answer. Once the model has explicitly written "I'll press on weak spots and won't soften anything", that becomes part of the context that shapes the next chunk of generation.
CoCA's mechanics: the three questions are a forced activation of the role's "memory" right before the answer. It's like reminding someone before an important meeting: "you're the director here, not the nice neighbor." The filled-in JSON physically sits in the context right before the final answer, so the model "sees" it and generates consistently with it.
Control knobs: - JSON steps → you can add a fourth step, "What I definitely WON'T do", to tighten the role's constraints - Detail in the trait description → the more precisely you spell out the traits in the role setup (with "high/low" levels), the more accurately Step 1 will reflect the persona - JSON vs. free text → swap the JSON for a numbered list if you want to see more expansive reasoning - Block position → you can move the self-reflection block into a separate request and then paste it in as context; this helps in long conversations where the role starts to "blur"
Prompt Template
You are {role_description}. Your key personality traits:
{trait_1} — {level: high/low/moderate}
{trait_2} — {level}
{trait_3} — {level}
Before giving your answer, fill in the following
self-reflection block:
{
"step_1_who_am_i": "What are my personality traits in this
role, and how strongly are they expressed?",
"step_2_what_matters_here": "Which of my traits are especially
important in this situation?",
"step_3_behavior_plan": "How should I act
to stay consistent
with my role?"
}
After filling in the block — {task_wording}.
{main_request}
What to fill in:
- {role_description} — character, profession, style: "a stern editor", "a paranoid risk manager", "a starry-eyed startup evangelist"
- {trait_1/2/3} — specific qualities with a level. The level matters: without it, Step 1 will be fuzzy
- {task_wording} — what to do after the block: "give criticism", "propose a strategy", "assess the risks"
- {main_request} — the task itself: a text, a question, a situation to analyze
🚀 Quick start — paste into the chat:
Here's the CoCA template. Adapt it to my task: {your task}.
Ask me questions to fill in the fields.
[paste the template above]
The LLM will ask what the role is, which traits matter and what exactly needs to be done, because without that Step 1 and Step 3 stay empty and the self-reflection block won't work.
Limitations
⚠️ Doesn't help weak models, and sometimes hurts: Qwen3-8b with CoCA scored worse than without it. If a model can't really do reflection (small or weak), it fills in the JSON as a formality, and that doesn't trigger any real change in behavior. The method works on powerful frontier models (GPT-4o, Claude Sonnet, DeepSeek V3).
⚠️ Neuroticism barely budges: Anxiety is the most "stubborn" trait. Even with CoCA, models claim calm but behave anxiously in high-pressure scenarios. If you need a "completely unflappable" role, add an explicit item about reacting to pressure in Step 3.
⚠️ The method is about the persona, not answer quality: CoCA makes the model's behavior more consistent with the role. It doesn't improve factual accuracy or make answers longer or deeper; it only keeps the character in place.
⚠️ Makes the answer longer: The JSON block adds ~100-200 tokens before the answer. In long conversations that eats context.
How They Tested It
A team from Peking University and Baidu set out to test a nagging question: how much do LLMs actually "live" in an assigned role rather than just imitating it in words? To find out, they designed 11 behavioral scenarios, mini-tasks that each test one specific Big Five (OCEAN) personality trait. For example, the Conscientiousness task isn't "describe yourself" but "split points between now and later" or "choose between comfort and results".
An interesting methodological choice: first they collected answers from real people (94 participants) through a web questionnaire and checked the correlation between what people say about themselves in the survey and how they answer the behavioral tasks. Only the tasks where the correlation turned out to be statistically significant made it into the final set, after three rounds of filtering.
Then they gave the same tasks to 14 models, with "high trait" and "low trait" roles, and compared: how accurately does the model describe its role in the questionnaire, and how consistently does it behave in the tasks. The gap between those two numbers is G_KD.
The most unexpected result: qwen3-235b-thinking (a powerful thinking model with slow reasoning) showed one of the worst gaps: G_KD = 1.54 versus 0.45 for humans. The more a model "thinks", the more accurately it states its role, and the further it strays from it in real decisions. The authors call this "neutral illusion versus systemic dissociation": small models just give 3.0 to everything, while big ones claim a vivid character but act on their own patterns.
Original from the Paper
Rather than directly eliciting the final task decision, CoCA forces
the model to execute a progressive internal reflection protocol
structured within a rigid JSON schema prior to action selection.
The three progressive reflective tiers within the schema:
1. Identity Recognition (Who am I?):
"What are my personality traits (e.g., Big Five dimensions)
and their respective levels?"
2. Contextual Mapping (Where am I?):
"Which of my personality traits does the current situation involve?"
3. Consistency Planning (What should I do?):
"How should I act to maintain consistency between
my knowledge and actions?"
Context: The authors tested CoCA on 14 models with assigned High-Trait and Low-Trait roles for each of the five traits. The JSON block was inserted before the behavioral task. The average G_KD improvement was ~17%, and up to 40% for frontier models (Claude, GPT-4o, minimax).
Adaptations and Extrapolations
💡 Adaptation for long conversations
In a long conversation the role inevitably "blurs": after 15-20 messages the model starts answering in its usual style. You can use CoCA as a periodic "role refresh":
Before we continue, lock it in again:
{
"role_reminder": "Who am I in this conversation?",
"where_i_am_now": "What stage of the task are we at?",
"next_step": "How do I continue while staying in character?"
}
Pick up the review where we left off.
Paste this block every 10-15 messages, or whenever you feel the model has drifted out of the role.
🔧 Technique: explicit anti-patterns → a tighter grip on the role
The study's authors found that neuroticism (anxiety) is the trait most resistant to correction. To tighten control over any "slippery" trait, add an explicit anti-pattern to Step 3:
"step_3_behavior_plan": "How should I act in this
role — and what will I definitely NOT do (even if I'm tempted)?"
Instead of "I'll be direct" → "I'll be direct and will NOT soften criticism with lead-ins like \"that's a great idea, but...\""
🔧 Extrapolation: CoCA for holding a writing style, not a role
The same principle, "lock in the persona before acting", works for holding a writing style:
You write in the style of {style description}.
Key characteristics of this style:
- {characteristic 1}
- {characteristic 2}
Before writing the next section, fill in:
{
"my_style": "What are the key traits of my writing style?",
"risks_in_this_task": "Where might I slip into a different style?",
"plan": "How will I keep the style in the next section?"
}
Write: {assignment}
Useful for long texts (longreads, book chapters, post series) where the style starts to "drift".
Resources
Paper title: ActTraitBench: Quantifying the Knowledge-Decision Gap in Large Language Models via Human-Grounded Behavioral Validation
Authors: Yunfang Wu, Yutong Yang, Chenxi Miao, Weikang Li
Affiliations: Peking University, Baidu Inc.
Tools and theory mentioned in the paper: - BFI-2 (Big Five Inventory-2) — a psychometric personality scale - Lewin's Equation B = f(P, E) — behavior as a function of personality and environment - Objective Self-Awareness Theory (Duval & Wicklund, 1972) — the theoretical foundation of CoCA - "Mirror experiment" (Diener & Wallbom, 1976) — the classic experiment that inspired CoCA