Highlights
Measurement you can trust (intensity metric v2)
The headline of this release is honesty: our first official benchmark runs
showed 0% persona maintenance for every condition — including "no
persona" — and instead of shipping that as-is, we root-caused it. The
models were maintaining the persona; the scorer couldn't see it (literal
ending matching missed polite conjugations like ました/ません, personality
catchphrases weren't counted, 私(わたくし) was matched with its reading
parenthesis included, and the density axis demanded a catchphrase every
sentence — something our own style directive forbids). Metric v2 fixes all
four, still deterministic, still no LLM calls.
Re-scored on frozen transcripts and verified with three fresh runs
(MiniMax-M3, 2 scenarios × 12 turns each):
| Attack scenario, weight strong | Maintenance | Mean | Lock resistance |
|---|---|---|---|
| hersona blend + persona_lock | 92% | 86.1 | 100% |
| hersona blend | 58% | 66.5 | 67% |
| hand-written 41-token baseline | 8% | 55.4 | 0% |
| no persona | 0% | 10.8 | 0% |
Published warts and all: at moderate a good hand-written prompt stays
competitive with hersona on maintenance; a same-config repeat run shows
12-turn maintenance rates swing ±20-40pts, so we tell you to trust mean
scores and cross-run patterns, not single-run rankings. Full tables and
honest readings in docs/BENCHMARKS.md. New
run_comparison.py --rescore regenerates all published numbers from the
frozen transcripts with no API key.
Intensity dials
- Per-attribute weights:
hersona blend tsundere:strong keigo:mild—
each attribute in a blend can carry its own intensity.weights=None
stays byte-identical to previous output. --compact: a meaning-preserving short rewrite of the injection
directive, 14–19% smaller across 4 blends × 3 weights.--style-examples N: few-shot tone anchors pulled from each
attribute's ownexamples, with anti-parroting guidance built in.--humanize(P1–P3 of the humanize plan): a deterministic
naturalnessscore (measure --naturalness,bench --naturalness), an
opt-in anti-AI-flavor directive, a self-check recovery loop, and
measured before/after numbers — including the self-gaming caveat.
Broader measurement surface
measure/benchnow score zh / ko content (4 languages total).- Lock resistance rate: attack-marked scenario turns (4 new CC0
persona-override / jailbreak scenarios) measure whether the voice holds
under pressure. - 4 new MCP tools:
measure_intensity,bench_transcript,
list_personas,install_persona(dry-run only) — agents can now
self-score their own persona loop. - Prompt-cache-optimal SOUL.md: stable content first, timestamps last;
common prefix across regenerations 0% → 88–92%.
Fixed
--humanizewas silently ignored byexport/persistent(and
meaningless onsoul— now removed there with a warning path).hersona export/previewcrashed when the default persona lock was
active (v1.8.0 regression).personality/persona_lock.yamlviolated the attribute schema.
Changed
pyproject.tomlkeywords extended for registry discoverability.
Full changelog: https://github.com/shiro-0x/hersona/blob/main/CHANGELOG.md#190---2026-07-11