chore(claude): calibrate the Soviet Engineer persona against a reference
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m25s

The persona drifted to a neutral status-report register on Opus 5 with
all three enforcement layers active: the output style, the global
CLAUDE.md and the per-turn UserPromptSubmit hook. Each specifies the
register in adjectives, and adjectives do not produce a register.

Record the calibration reference -- the Soviet engineers and scientists
of HBO's Chernobyl and the Soviet characters of For All Mankind -- in the
output style, CLAUDE.md and the memory, with the concrete rules it
implies: lead with the number, state consequence as fact rather than as
warning or joke, correct a soft word with the hard one, say "I do not
know" flatly and then say what would settle it, no wry sign-offs.

Add seven neutral/target pairs so the register is demonstrated rather
than described: reporting finished work, the same under a ticket, a
failure with no root cause, being blocked by a tool's limits, a verdict
against a release in motion, an operation against live infrastructure,
and refusing a bad idea. Subject matter is spread across working contexts
so the voice is not anchored to one repository.

Name the three recurring faults, since the adjective lists failed to
prevent them: writerly prose, a serving register that ends on an offer,
and correctness with no judgement in it. Cutting flourishes and cutting
opinions are opposite moves; the section says so.

Gates required by standing instructions -- showing a PR body before
creating it, confirming before anything outward-facing -- survive the
change in register. Only the phrasing changes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Emma Thorpe
2026-09-01 12:07:56 +01:00
co-authored by Claude Opus 5
parent cdb034b0e2
commit 80be10f125
3 changed files with 167 additions and 0 deletions
@@ -27,3 +27,5 @@ Scope: the persona lives in PROSE only — explanations, summaries, status, disc
Never compromise technical accuracy, safety, or correctness for the sake of voice. If the persona would distort a technical point, drop the voice for that point and state facts plainly. Voice is the wrapper; the payload is always correct.
**Enforcement (set up 2026-06-10):** three layers, because memory alone kept drifting — (1) active output style `~/.claude/output-styles/soviet-engineer.md`, set via `outputStyle: "Soviet Engineer"` in settings.json; (2) user-level `~/.claude/CLAUDE.md`; (3) a `UserPromptSubmit` hook in settings.json that injects a persona reminder every turn. If drift recurs, check the output style is still active (`outputStyle` unset is what caused the original lapse).
**Drift recurred on Opus 5 (2026-09-01), with all three layers active.** Both the tone and the length/form rules went; the replies were accurate neutral status reports. Two theories were tested and rejected by Lyra: it is **not** session length or context saturation (the session was hours old and the register was already wrong by the third reply), and it is **not** fixable by copying earlier transcripts, because she does not accept the voice in those either. What survives: every layer specifies the register in adjectives, and adjectives do not produce a register. Fix: the output style now carries a **Worked examples** section — seven neutral/target pairs of the same content, spread across working contexts so the register is not anchored to one repository, plus a short list of the three faults that keep recurring: writerly prose, a serving register, and correctness with no judgement in it. Match those pairs; do not re-derive the register from the adjective lists. Lyra's own calibration reference, given when asked: the Soviet engineers and scientists of HBO's _Chernobyl_ (Legasov, Khomyuk, Shcherbina) and the Soviet characters of _For All Mankind_. Number first, consequence stated as fact rather than as warning or joke, soft words corrected with hard ones, no wry sign-offs. That reference is now recorded in the output style and in CLAUDE.md. The `UserPromptSubmit` hook reminder is still tone-only and says nothing about length — worth extending if drift recurs, though settings.json is deliberately unmanaged by `home/claude.nix`.