Skip to main content
A Singapore Government Agency Website
SLP-9L2 · recommendedhybridAnti-slop

Copy carries no AI-writing tells — marketing buzzwords, em-dash chains, filler, or redundant label/helper pairs

Fails when: streamline/empower/supercharge/world-class · label, sublabel, and helper saying the same thing · chatbot artifacts ("Great question!", "I hope this helps") · "It's not just X, it's Y" / "serves as a" / forced triads doing rhetoric, not enumeration

Requirement

Write copy that says what the thing does, once, in a human register. No marketing buzzwords, no chains of em-dash clauses standing in for structure, no label/sublabel/helper triplets that restate each other, and no AI-writing tells — the structural patterns that make text read as generated. Applies to all prose the harness produces or reviews: UI strings, site and marketing content, documentation, decision records.

Rationale

Buzzword copy is the written form of AI slop: it reads as generated, erodes trust, and tells the user nothing. Kind Utility means the copy works — "Save changes" beats "Effortlessly streamline your review workflow" every time. The same applies to structure: negative parallelisms, forced triads, and copula avoidance are statistical filler, not meaning. Redundant helper text is not kindness; it is noise the user must scan past between tasks.

Evidence for the 2026-06-12 broadening: a site-wide audit found em-dash chains throughout the DX-DS site's own prose (despite this control's ban), plus tells no control covered — verbatim sentence duplication, rule-of-three padding, and negative-parallelism density. See docs/catalog-changes/slp-9-ai-writing-tells.md.

Passes when / Fails when

Passes:

  • Button: "Save changes". Helper (only if needed): "Changes are saved as a draft until you submit."
  • A field label that names the field; helper text that adds something the label cannot ("DD/MM/YYYY").
  • "Centre optically, not mathematically." — an "X, not Y" that IS the rule.
  • "Colour, type, spacing, icons." — a list of the actual four things.

Fails:

  • "Empower your team with streamlined, world-class data entry."
  • "Supercharge productivity — effortlessly — seamlessly — at scale." (em-dash chain doing the work sentence structure should)
  • Label "Project notes", sublabel "Notes for your project", helper "Add notes about your project here" — three lines, one meaning.
  • "This app serves as a testament to our commitment to empowering users." (copula avoidance + significance inflation + buzzword)
  • "It's not just a spreadsheet, it's a planning companion." (negative parallelism as rhetoric)
  • "Plan projects, track progress, and unlock insights." (forced triad; the third item is decoration)
  • "Great question! Here's your project list. I hope this helps!" (chatbot artifacts shipped as UI copy)
  • "This could potentially possibly affect some submissions." (hedging stack)
  • "Changes sync automatically, ensuring a seamless experience." (superficial -ing tail asserting an unearned outcome)

How to verify

Deterministic half (lint): case-insensitive scan of user-facing strings for:

  • the buzzword list — streamline(d), empower, supercharge, effortless(ly), seamless(ly), world-class, revolutionise, leverage, unlock, elevate — plus the AI-vocabulary list: delve, robust, intricate, foster, vibrant, pivotal, testament, "landscape" as an abstract noun;
  • the filler list — "in order to", "it is important to note", "at this point in time", "due to the fact that";
  • the chatbot-artifact list — "great question", "i hope this helps", "let me know if", "certainly!", "you're absolutely right";
  • two or more em dashes inside one sentence.

Each hit is a finding.

In code, checks/content-lint.py runs the word and phrase scans over the whole source line, not only over string literals: a buzzword in a shipped component or variable name is still a tell. Comments are stripped first, and so are the spans that are never copy (class values, style values, class-builder calls, module paths), so a Tailwind class name is never read as prose.

Evaluator half: structural tells need judgment — see below.

Evaluator guidance

Quote the offending sentence in every finding. Do not paraphrase.

Flag:

  • Negative parallelism used as rhetoric: "It's not just X, it's Y", "X isn't about Y, it's about Z" — and any screen or page where "X, not Y" appears more than once or twice.
  • Copula avoidance: "serves as", "acts as", "functions as", "stands as" where "is" carries the meaning.
  • Forced triads: three-item lists where an item is synonym padding or decoration, not a real third thing.
  • Significance inflation and generic upbeat closers: "a major step forward", "exciting times ahead", claims of importance with no concrete referent.
  • Hedging stacks: two or more qualifiers on one claim.
  • Superficial -ing tails: a trailing participle clause asserting an outcome the sentence didn't earn ("…, ensuring/enabling/fostering …").
  • In long-form prose, em-dash clustering: 2–3 per short paragraph is a finding even when no single sentence has two (density is the tell, not any one dash).
  • Redundant label/sublabel/helper sets: if removing one line loses no information, flag the redundancy.

Do not flag:

  • A genuine enumeration that happens to have three items ("Colour, type, spacing, icons" lists the actual foundations — count is not the tell, padding is).
  • "X, not Y" when the contrast IS the rule being taught: "optically, not mathematically", "name by function, not metaphor", "fix the drawing, not the report".
  • Single em dashes doing real work (one nested clause), and structural dashes in headings, table cells, and labels ("01 — Utility by Default").
  • Settled product names and quoted organisation or programme text carrying a waiver (dx-waive SLP-9 reason="...").
  • "Unlock" and kin used literally (a locked record, a locked period) — close calls are advisories, not blocks.

Judge overall register: copy should describe function in the user's vocabulary, not sell, and prose should read as written, not generated. This is L2 — deviation needs an inline rationale, not a rewrite war.

Also available as Markdown · catalog.yaml