Cluster every product string to surface synonym drift, tone outliers and reading-level spikes — then adjudicate a term base that feeds your voice-system prompt. Users can't build a mental model of a "workspace" that three screens later becomes a "project"; this sweep finds every split before your users have to.
Workflow area: Content & UX Writing · Tier: Core · Hands-on time: ~30 minutes
Terminology drift is invisible from inside any single file. Each screen's copy looks fine locally; only the whole corpus reveals that "remove," "delete" and "discard" are being used interchangeably, that onboarding reads at grade 6 and settings at grade 14, and that the billing flow is somehow the only chirpy part of the product. Reading every string side by side used to be a week of content-designer time. A model can cluster the corpus in minutes — leaving you the part that actually needs a human: deciding which term wins.
Export the corpus. Pull every user-facing string: localization files (JSON, XLIFF, strings), CMS exports, and Figma text layers for unshipped work. Include string IDs — findings without IDs can't be fixed. Dedupe, then note the count; a few thousand strings is normal and fine.
Run the drift analysis. Paste the corpus (or attach the file) with this prompt:
Here is our product's full string corpus with IDs. Analyze it for
terminology and tone drift. Do not rewrite anything yet.
1. SYNONYM CLUSTERS: group different terms used for the same concept
(e.g. remove/delete/discard, workspace/project/board). For each
cluster list every variant with its string IDs and a count.
2. TONE OUTLIERS: flag strings whose register clearly differs from
the corpus norm (jokey, apologetic, formal) with IDs.
3. READING-LEVEL SPIKES: flag strings well above the corpus's typical
reading level, with IDs.
4. CASING & PATTERN INCONSISTENCY: title case vs. sentence case,
terminal periods on some tooltips but not others.
Output as four tables. Report ONLY what is in the corpus — do not
infer strings that are not present.
[PASTE CORPUS OR ATTACH FILE]
Good output looks like this:
SYNONYM CLUSTERS
Concept: remove an item
"Delete" — 41 uses — IDs: btn.file.del, dlg.confirm.del, ...
"Remove" — 27 uses — IDs: btn.member.remove, ...
"Discard" — 6 uses — IDs: editor.discard, ...
Concept: main container
"Workspace" — 88 · "Project" — 31 · "Board" — 4
Spot-audit before you trust it. Pick two clusters and check five listed IDs each against the real corpus. You are looking for the two classic failures: invented strings (an ID that doesn't exist) and false merges (a cluster mixing genuinely different concepts — "delete a file" and "delete an account" may deserve different words). If more than one in ten checks fails, tighten the prompt and re-run before adjudicating anything.
Adjudicate — this part is yours. For each cluster, a human decides the winner and the rule. This is design judgment, not string counting: "remove" for reversible actions, "delete" for permanent ones is a distinction, not drift. Record each decision in a term base: term, definition, when to use, never-use list, decided-by and date. Where the split is contested, take it to the team; the sweep gives you counts and evidence, which is what ends the meeting.
Generate the fix list and feed the system. Have the model turn the adjudicated term base plus the cluster tables into a change list — string ID, current text, corrected text — for review, then batch the updates into your localization files and Figma. Finally, paste the term base into your pb-27 voice-system prompt so new strings stop drifting the day the old ones are fixed.
String corpora occasionally embed personal data in example text or unreleased feature names — scan the export before pasting it anywhere, and run the sweep in your organization's approved AI tenant.
The model finds the drift; the counts end the debates; you make the calls. Adjudicate once, encode the result in the term base and voice prompt, and the sweep becomes maintenance instead of rescue.