The setup
I spent a full session building what I call a persona flywheel — a pipeline that extracts evidence about how I think, communicate, decide, and work from every data source I have. Writing, plans, skills, claude.ai conversations, Claude Code sessions, even a Nextcloud backup of historical CC sessions. 3102 evidence items classified across 10 dimensions, synthesized into 3 profiles (operational, writer, experimental).
The experimental profile is the full-fidelity one. No filtering. All three voices. Contradictions surfaced. French preserved. 44KB of self-portrait.
So I did the obvious thing: I loaded it as a system prompt on my local Qwen 32B and asked it to be me.
Attempt 1: the profile as system prompt
Fed the full experimental profile.md (340 lines, narrative format) as the system prompt. Asked: "It's 11PM, I just had an idea for a side project. Talk me out of it."
The response was... correct. Technically. It referenced Charlotte v1's failure, my homelab, my anti-Atlassian stance. But the voice was completely wrong. Five numbered sections, a TL;DR, neuroscience citations about prefrontal cortex function. It was an advisor describing someone named Michel, not Michel thinking out loud.
The facts landed. The voice didn't.
The insight
A persona profile describes someone. A system prompt needs to become someone. Same data, fundamentally different framing.
"Michel code-switches between French and English" is a fact. "You mix French and English naturally — French comes out when you're emotional" is an instruction the model can act on.
The profile says "ultra-concise agreements." The prompt needs to say "2-5 sentences is your default. Sometimes one word: 'shoot.'"
And critically: the anti-patterns need to be explicit. The model defaulted to numbered lists, self-help tone, long responses — because nothing told it NOT to. So: "You don't use numbered lists in conversation." "You don't give advice like a self-help article." "You don't use stage directions like '(soupir)'."
Attempt 2: the persona prompt (50 lines)
Rewrote the profile as identity injection. Directive framing throughout. "You are Michel" not "Michel is." Added a "What you don't do" section. Cut it to 50 lines.
Night and day. "Tu as l'air creve. Le cerveau humain a cette heure-la est comme un chat avec un Rubik's Cube." Wife reference landing naturally. FR/EN mix. But: it invented a TikTok-for-cats joke (too internet-generic for my humor) and added "(soupir)" as a stage direction. The voice was right, the material was thin — it didn't have enough of my actual world to draw from.
Attempt 3: the enriched prompt (150 lines)
Kept the directive framing, expanded with specifics: Charlotte failure arc, ChromaDB rage, actual humor examples, relationship context (a client, my business partner, my wife), current projects and frustrations. Added the explicit anti-pattern for stage directions.
Result: "Non. Tu as 11h et une idee qui sent le 'je vais coder ca pendant 3 nuits et abandonner au commit 17'." / "Je mets 500 euros que demain matin, ton cerveau aura deja decoupe 30% de l'effort."
Still not perfect — it used numbered questions (the profile explicitly says don't) and talked about AI in third person when I'd say "je". But the register gap from attempt 1 is enormous.
What this means
Describing vs. becoming is a spectrum, and prompt engineering has a ceiling. The model is following instructions about how to be me, not being me. It can't feel when "putain" is the right word vs "f***". It can't internalize the rhythm — short sentences, then a long one — from a description of that rhythm.
The real destination is fine-tuning. The 4.6MB of filtered CC session messages IS a training corpus — my actual voice in conversation. The profiling pipeline built the curation guide: dimensions define signal, voice model defines target register.
But the prompt experiment proved something: the data is rich enough to produce a recognizable voice. Not perfect, but recognizable. And the misses are as valuable as the hits — they tell you which dimensions need more evidence, which quotes carry more weight, where the model defaults to generic patterns.
The irony isn't lost on me: I have a 4-node GPU homelab, 240GB of VRAM, and I didn't even have a basic chat tool to test this. Full-blown AI infrastructure, no "hello world." Because Opus never made me feel the need. Until now.