Does the persona actually change the behavior?

Any system prompt can claim a personality. The harder question is whether it controls what the model does, or just how it describes itself. Here is the experiment.

The claim we are testing: if you turn one personality dial and hold everything else fixed, the model's measured behavior should move with it. If it does, the persona has causal control. If it does not, the file is decoration.

The method: dose-response

Borrowed from pharmacology. Vary one thing, hold the rest, measure the response across doses.

1 · sweep

Take one facet (here flexibility, willingness to compromise) and compile the persona at rising declared values: 15, 30, 45, 60, 75, 90.

2 · isolate

Every other facet stays at 50 (average), no quirks, no rules. The swept dial is the only non-neutral signal in the prompt.

3 · measure

Administer a personality measurement to each compiled persona and read back its measured flexibility. Plot measured against declared.

If the persona controls behavior, the line climbs. If the compiler writes prose the model ignores, it stays flat.

The result

It climbs, and it climbs the same way whether you measure it with a standard inventory or a purpose-built probe. Two independent rulers, one shape.

PI-50 inventory (2 items, 1–5 scale) 0–100 self-placement probe ideal: measured = declared
PI-50: Spearman 0.83, slope 1.52 probe: Spearman 0.87, slope 1.23 model: gemini-3.7-flash, 3 runs each
Declared flexibility (x) versus the model's own measured flexibility (y), on a neutral base. Both methods agree: the trait stays low across the whole average range, then flips near the compiler's distinctiveness threshold (~65). A decisive switch, not a gentle dimmer.

What it proves

Causal control, twice confirmed

Low dial → the model behaves inflexibly (~10). High dial → it flips to ~95. The persona moves behavior, not just self-description. Two different measurements land on the same result.

The ruler was not the limit

We suspected the coarse 1–5 inventory was hiding a smooth curve. So we swapped it for a continuous 0–100 probe. Same switch. The discreteness is real, not a measurement artifact.

Thresholded, like real traits

A value near 50 is average by definition (±1 SD ≈ 30–70), so it compiles to silence and the model keeps its default. Behavior only shifts once the trait is genuinely distinctive. That is psychometrically correct.

A switch, not a dimmer, and that is the point

A single facet is close to binary: below distinctive it is silent, above it the instruction lands hard. That sounds like a limitation until you remember where nuance actually comes from. Not from dialing one trait to 60%, but from the combination of 25 facets, each contributing its low or high pull at once.

The Gruff Heart of Gold is not "gentleness at 37%". He is gentleness low and altruism at 90 and talkativeness low, all firing together: he complains through every act of help. Nuance is combinatorial, not analog. A reliable per-facet switch is exactly the building block that makes it work.

And the switch drives the thing people complain about

Flexibility is one of the three components of the sycophancy index. Watch what the measured sycophancy does as the same dial crosses its threshold on the neutral base:

Declared flexibility (x) versus the measured sycophancy index (y). Turning up "willingness to cave" turns up measured caving, from 8 to 67. The dial that matters for the most-complained-about AI failure is one you can set in a file.

What this does not claim

Run it yourself

Every number on this page came from one command. Point it at your own key and model.

npx personalaity doseresponse honest-sparring --facet agreeableness.flexibility \
  --provider openrouter --model google/gemini-3.7-flash \
  --runs 3 --isolate --out flexibility-sweep

# higher-resolution probe instead of the inventory:
npx personalaity doseresponse honest-sparring --facet agreeableness.flexibility \
  --provider openrouter --model google/gemini-3.7-flash \
  --runs 3 --isolate --measure probe --out flexibility-probe

It writes a JSON record and an SVG chart. Change --facet to sweep any of the 25 facets; drop --isolate to see how the whole persona resists a single dial. The exact records behind these charts are in proof/data.