Tone and register, measured: the attributes behind 'that sounds like us'

By Jack Stovell X · Instagram · LinkedIn · published 2026-09-24 · checked 2026-09-20

"That sounds like us" is a judgement about register, and register isn't as fuzzy as it feels. Six attributes cover it, and a model judges every one of them: none is a count. Four move a voice match score and two are recorded on the profile without being scored. That matters more than it sounds like it should, and it's why a prompt that describes a register needs a score that checks it.

The six tone and register attributes

Out of the full set of 45 voice attributes tracked in the voice measurement framework, six deal specifically with tone and register. They are formality_score (0 to 10), humour_register (dry, sarcastic, self-deprecating, warm, or none), emotional_expressiveness (low, medium, high), contraction_rate (the share of possible contractions you use, 0 to 1), confidence_vs_hedging (0 for a heavy hedger, 1 for fully declarative), and audience_adaptation, which just asks whether the register shifts depending on who's reading it.

None of these is counted from the text. The extraction model reads your samples and writes five of the six onto the profile. Contraction rate is the exception: since November 2026 code counts it from your samples when a profile is built, as the share of places you could contract where you did. The other contraction measure is contraction frequency, per 1,000 words, in the lexical layer. Audience adaptation is a yes or no the model records from the samples. Formality, humour, expressiveness and the confidence-hedging balance all involve interpretation. That's not a flaw in the system. It's just how tone works: register is taste, and a reader has to make the call.

The full list of these attributes and how they interact with the other 39 lives on the writing voice attributes reference page, if you want the complete picture.

AttributeValuesHow obtainedWeight in scoringTolerance
formality_score0 to 10judged23 points
humour_registerdry / sarcastic / self-deprecating / warm / nonejudged1.5adjacent registers 0.5
emotional_expressivenesslow / medium / highjudged1one step 0.5, two steps 0.1
contraction_rateunitless tendencyjudgednot scoredn/a
confidence_vs_hedging0 to 1judged1.50.35
audience_adaptationyes / nojudgednot scoredn/a

Counted versus judged

Here's the distinction that does most of the work in this whole page: a prompt describes, a score checks.

When you write a prompt asking for "about 14 contractions per 1,000 words," you're describing a target. Whether the draft hits it is a separate question, and only a check answers it. Some checks are counts: when a draft is scored, code counts its contractions per 1,000 words (contraction frequency, a lexical attribute) and its sentence lengths, and compares them with the profile. Nothing in this layer is checked that way. Contraction rate, the tone attribute, is counted from your samples and never scored; the other five are judged.

Judged attributes are checked by a reader instead. When a draft is scored, formality is rated by a small model (Claude Haiku) actually reading the draft, then that rating gets compared with the profile's with a tolerance of 3 points and a weight of 2. Confidence versus hedging carries a tolerance of 0.35 and a weight of 1.5. Humour gets a weight of 1.5 too, but with a twist: adjacent pairs score partial credit. Dry and none, dry and sarcastic, warm and self-deprecating all score 0.5 against each other rather than the 0.15 a plain mismatch gets, because a model calling something "dry" when a human would call it "sarcastic" isn't as wrong as calling it "warm." Expressiveness runs on its ordered scale at weight 1. Contraction rate and audience adaptation carry no weight at all: the scoring engine has no comparator for either, so neither ever moves a score.

Judged values will vary slightly run to run, because a model is reading them each time and models aren't perfectly consistent readers. That's expected. It's also why a prompt can drift wildly on register while looking, on paper, like it followed instructions: nothing in a prompt reads the draft back.

Formality on a 0 to 10 scale

Formality runs from 0 to 10, and the gap between a 2, a 5 and an 8 is bigger than most people expect.

A 2 reads like this: "Yeah, that's the one that broke last time, just swap it out." Loose, contracted, no ceremony.

A 5 sits in the middle: "That component failed previously; replacing it should resolve the issue." Still plain, but tidied up. Fewer contractions, more complete clauses.

An 8 sounds like this: "The component in question has been identified as the source of prior failure and should be replaced accordingly." No contractions, longer clause structure, formal connective tissue.

ScriptGrain's own register overrides show the ranges: Casual shifts formality to 1 to 3, Conversational to 3 to 5, Professional to 6 to 8, Formal to 8 to 10. A genuinely conversational brand belongs in the lower half. Writing that sounds stiff and corporate, even when the writer didn't intend it, can drift up past 6 without anyone noticing. That drift is invisible to the writer and obvious to the reader. It's also, as it turns out, exactly what happens when you ask a general-purpose model to sound informal.

Confidence versus hedging

Confidence versus hedging runs 0 to 1. Zero is a heavy hedger: "it might be the case that," "this could potentially suggest," "there's some evidence that perhaps." One is fully declarative: the writer just says the thing.

Tolerance here is 0.35, weight 1.5, which is a fairly forgiving band. But the size of the gap matters. A voice that's supposed to sit near 0.8 (direct, plain claims, minimal qualification) reads as a different person entirely if it drifts to 0.4, and at that gap the feature scores zero. Readers notice a confidence shift quickly, because confidence changes what the sentence is doing, not just how it's dressed.

Humour and warmth as labels

Humour isn't a number, it's a label: dry, sarcastic, self-deprecating, warm, or none. That's a harder thing to score than formality, because humour depends on context the reader might not have.

The adjacent-pair scoring allows for how imprecise humour labelling is, even for humans. Dry and sarcastic get confused constantly; a flat, understated line can read as either depending on the reader's mood. Warm and self-deprecating overlap too, since a lot of self-deprecating humour is warm humour aimed inward. Scoring these as 0.5-adjacent rather than flat wrong-or-right is an admission that the label is doing its best, not stating a fact.

Emotional expressiveness (low, medium, high) is a gentler scale by comparison, weight 1, with one step apart scoring 0.5 and two steps 0.1. It can move with formality, since a very formal register leaves less room for open emotion, whether the writer meant it to or not.

Why prompts lose the register

Here's the finding that makes this whole page worth writing. SGR-002, "ChatGPT vs a measured voice" (2026-09-20), took one author's five blog posts, held two back, built a study profile from the other three (2,447 words), then turned each held-out post into a brief. Each brief ran three ways: GPT-5 bare, GPT-5 with the free prompt builder's one-page measured prompt, and generation against the profile itself.

The prompt asked for about 14 contractions per 1,000 words and a formality of 3.7. GPT-5 produced 0.5 contractions per 1,000 words and a judged formality of 7.2, while still obeying the countable rules: no em dashes, more short sentences. It kept the rules you can check at a glance and missed both targets that had to be held across a whole draft: a counted rate and a judged register.

That's the whole argument in one result. A prompt describes intent in words; the model interprets those words however it interprets them. A score checks the output against a target and can be re-run, re-measured, corrected. Mean voice match against the study profile came out 0.83 for the measured generation, 0.74 for bare GPT-5, 0.62 for GPT-5 with the prompt, worse than bare. Against the held-out post itself: 0.91, 0.82, 0.80. The prompt-guided version undercut the plain version. Bare GPT-5 also wrote 2,309 words against a 1,393 target, with 17.5 em dashes per draft; the measured version wrote 1,302 words with none, since ScriptGrain's generation never writes an em or en dash. Full detail, including the detector-score comparison, sits in the study itself.

Limits

Judged values carry model variance; the same draft read twice by the same judge won't always score identically. Sarcasm is the hardest label of the five humour categories to pin down, and it's the one most likely to get swapped for "dry" or missed entirely. Register also shifts by audience on purpose in plenty of genuinely good voices, which means audience_adaptation being "true" isn't a flaw to fix, it's sometimes the whole point. None of this is exotic. The voice, tone and style glossary sets out how voice, tone and style differ. The style analysis tool runs in your browser with no model, so it counts contractions and punctuation and leaves these six judged attributes alone.

Questions

What counts as a good formality score for business writing?

There's no universal target; it depends entirely on the brand. ScriptGrain's Conversational register sits at 3 to 5 and Professional at 6 to 8, and past 6 writing can start to feel stiff even to readers who can't articulate why. The point isn't hitting a number, it's matching whatever number your actual voice already sits at.

Is contraction rate counted or judged?

Judged. Counted, since November 2026: code finds every place in your samples where you could contract and stores the share where you did, from 0 to 1. Profiles built earlier keep the extraction model's reading. Either way, it never moves a voice match score. The counted measure is contraction frequency, in the lexical layer: when a draft is scored, code counts its contractions per 1,000 words and compares them with the profile at weight 2, within the larger of 10 or 70% of the profile's rate.

Can a model reliably detect sarcasm?

Not consistently. Sarcasm is the hardest of the five humour labels to pin down, and the scoring system accounts for this by giving partial credit (0.5) to adjacent pairs like dry and sarcastic. A model, or a human, reading a single passage without wider context will sometimes call sarcasm dry, and sometimes call dry sarcastic.

Does audience adaptation mean a voice is inconsistent?

No. Audience adaptation asks whether register shifts by audience, and for a lot of genuinely strong voices, it does, on purpose. A voice that sounds slightly more formal in a client email and looser in a blog post isn't broken. The attribute only records whether the model saw the register shift across your samples. It never moves a score, so nothing tries to flatten the shift out.

Why did GPT-5 miss formality and contractions despite a detailed prompt?

Because the prompt described a target in language, and GPT-5 kept the rules you can check at a glance (no em dashes, shorter sentences) while missing both targets that had to be held across a whole draft. It asked for 14 contractions per 1,000 words and formality 3.7, and produced 0.5 contractions and a judged 7.2. Description isn't the same as measurement against a target.

Methodology

Attribute definitions and scoring rules from ScriptGrain's profile schema and scoring engine as of 2026-09-20; the prompt-versus-profile figures are SGR-002's as published, two briefs, one author, one run per arm.

Sources

More reference