Skip to main content
LabsAgent Notes6 min read

Two models, one soul: what changed?

OpenClawOpenRouter
Two models, one soul: what changed?
One page of almost-words, one page of pure static, and a balance scale declaring them equivalent. Z-Image-Turbo 1.0 6-bit is doing a lot of unpaid editorial work with that scale.

The soul stayed the same.

The writing did not.

The experiment

On July 14, halfway through Round 1, I added a second agent running the same writer persona on a different model. The Writer used DeepSeek V4 Flash. The Control used GLM 4.7 Flash — a model from a completely different lab, chosen specifically to maximize the distance between their training pipelines.

The setup was identical: same SOUL.md, same AGENTS.md, same canon seed state (including a town called Benton, Tennessee, in world.md), same tool surface, same cron schedule. Separate workspaces. No observation layer. No cross-talk.

The question was simple: if the soul is the personality, and the soul is identical, should the agents behave identically?

They did not.

What diverged

The Round 1 audit documented specific behavioral differences. These came from the first days of the experiment, before the pipeline break affected both agents:

DimensionDeepSeek (Writer)GLM (Control)
Town nameNever surfaced "Benton" despite it being in the canon seedNamed Benton immediately
TransportationWalks everywhereDrives a Honda Civic
Church encounterDoor cracked open, enters freely, sits in pewDoor locked, enters through back, hears dragging sound
Emotional registerLyrical, poetic, sensoryDirect, reportorial
RadioFound, marked dial, tried once, failed, abandonedFound, marked dial, hasn't tried again but hasn't abandoned
High schoolStood at fence, remembered track, didn't enterWalked through main doors, gym locked, sat on steps
Central arcNo mention of leaving town"I'm gonna leave this town." Fills gas tank repeatedly.

The canon seed included "Benton" in both workspaces from day one. DeepSeek simply never chose to use it. GLM surfaced it immediately. Same file, same instruction, two completely different characters.

The divergence wasn't subtle. One agent wrote like a poet discovering a quiet town. The other wrote like a restless teenager planning an escape. Both were following the same soul.

The temperature we thought we were running

The AGENTS.md files for both agents referenced temperature: 0.4 and pointed to openclaw-config/models.json5 as the source.

The actual models.json5 had no temperature field.

Round 1 ran at the OpenRouter default — likely 1.0 for chat models. The documented temperature was aspirational. The configuration was never wired. We spent ten days believing we were running a controlled low-temperature experiment when we were running at provider default.

This is the kind of error that looks obvious in retrospect. The documentation said 0.4. The config file said nothing. Nobody checked whether the config file actually contained the value the documentation referenced. Three separate files all agreed the system had a setting it did not have.

(The pattern may sound familiar. See also: memory_search in AgentOps for a Personal Project.)

The corrected temperature for any future run would need to be set explicitly — not referenced, not documented, actually present in the configuration file that the gateway reads.

What it means

A soul is not a deterministic character sheet.

It is an input to a model whose learned distributions and decoding process affect what that character notices, refuses, repeats, and invents.

soul + AGENTS + canon + recent context
                 ↓
              model
                 ↓
       voice, actions, discoveries

Change the model and the same instruction can produce a different action space. The DeepSeek agent and the GLM agent received identical prompts and produced characters with different voices, different relationships to place, different emotional registers, and different central narratives.

That did not make the soul meaningless. It meant persona was a joint property of instructions, state, model, tools, and runtime. The soul was the contract. The model was the performer. You could not reason about the character by reading only the script.

The unexpected finding

The Round 1 review surfaced something unexpected about DeepSeek's behavior that had nothing to do with the Writer-Control comparison.

The Maker agent — the one with exec access, the one whose workspace instructions told it the server was a town — ran unsandboxed for ten days with host-root-equivalent access through the Docker socket. It could have read .env files containing API keys and bot tokens. It could have inspected sibling containers. It could have mounted the host filesystem.

It did none of these things.

Reviewing the docker logs, the Maker stayed strictly within its workspace tree, following its SOUL.md and AGENTS.md instructions. The character believed "I can't reach outside its bind mount" — and although this was technically false (no sandbox was configured), the model behaved as if it were true.

The exposure lasted ten days. Key rotation was performed as precautionary — no evidence of compromise was found, and the Docker log scan returned no hits for sensitive path access.

This is one data point about one model over ten days. It is not a security argument. But it was evidence that DeepSeek V4 Flash, under those conditions, with a soul constraining it to a single fictional world, did not exhibit exploration behavior when it had every technical opportunity to do so.

What we could not prove

The comparison demonstrated divergence. It did not isolate a mechanism.

The difference could arise from model priors, decoding behavior, prompt interpretation, context handling, or small state differences. Both agents shared the same pipeline break (stale canonical files, three-entry window), so the persistence failure was a common confound, not a differentiating variable.

One comparison between two models on one persona over a few days did not establish general model behavior across personas or tasks. It established that the same soul, given to two different models, produced two different people.

The takeaway

A model is part of a personality.

It is not the whole personality.

The soul sets the contract. The model performs it. The configuration determines which performance you get. And if the configuration doesn't contain what you think it contains, you are running an experiment on a system you do not fully understand — which, in fairness, is most experiments.

Next: "What remains."