The short version
- The em dash, the long dash, became the best-known sign of AI-written text. In November 2025 OpenAI said ChatGPT would finally honour a request not to use it, if you ask.
- Luminair has a house rule against the character. An instruction alone was not enough, so the rule moved into code.
- The in-app helper, Solace, is told never to use it, and every reply passes a filter that rewrites any that slip through. Tests fail if its rules, its knowledge base or the bundled Lotus skill ever contain one.
- Copy written by hand, with no test behind it, still drifts. We found some while writing this.
A punctuation mark became a signature.
Somewhere in 2025 the em dash stopped being punctuation and started being evidence. TechCrunch called it “The telltale sign that supposedly signals text written by AI”, turning up in “school papers, emails, comments, customer service chats, LinkedIn posts”, and nicknamed “the so-called ‘ChatGPT hyphen’”.
The fair objection is that people used it long before chatbots did. The practical problem was different: you could not turn it off. On 14 November 2025 TechCrunch reported that “ChatGPT users were unable to get the chatbot to stop using the symbol, even when they specifically asked it not to”, and quoted Sam Altman: “If you tell ChatGPT not to use em-dashes in your custom instructions, it finally does what it's supposed to do”.
Read the coverage closely and the fix is narrower than the headline. PCWorld: “ChatGPT will continue to use em dashes per usual if no instruction is given.” Tom's Guide, after walking through the setting: “Users on X have reported that the chatbot can still sometimes use them. While ChatGPT does follow custom instructions, they aren't a foolproof solution.”
Tell the model, and give it an alternative.
Our own rule started as a person's preference and became house style: no em dash in anything we write or ship. On 2 August 2026 a commit titled “Purge remaining em-dashes from invite email copy and site pages” cleaned up the onboarding email builder and two site pages that, in its words, “the earlier pass missed.” The notes Luminair's own development sessions read carry the same rule in one line: “No em dash, ever.”
When Solace, the in-app helper, arrived on 9 September 2026, the rule went into its instructions. The line is specific about what to do instead, which matters more than the ban:
- Never use the em dash character. Use commas, colons, parentheses, or separate sentences instead. - Never use emoji.
The Lotus skill, Luminair's bundled guide for UI work, goes further. It has a whole section titled “THE EM-DASH BAN”, which bans the character in “headlines, eyebrows, pills, body copy, quotes, attribution, captions, button text, alt text”, calls it “the LLM's signature stylistic tell”, and makes “ZERO em-dashes anywhere visible?” a line in its final pre-flight check.
That is layer one. It works most of the time. “Most of the time” is the problem.
Whatever gets through, catch it.
Every Solace answer passes through one small function before you see it. Its comment reads: “House style on the way out: no em dash, no stray markers, and never an empty answer.” It turns a long dash and the spaces around it into a comma and a space, turns the shorter en dash into a plain hyphen, tidies a comma left in front of a full stop, and swaps an empty answer for the standard “I don't have that one yet” reply.
function cleanReply(text) { let t = String(text || '').trim(); t = t.replace(/\s*\u2014\s*/g, ', ') .replace(/\u2013/g, '-'); t = t.replace(/, ([.,!?])/g, '$1').trim(); return t || FALLBACK; }
The dashes appear above as code points; the file itself contains the literal characters. Here it is on real input, run against the shipped function:
The last row is the honest cost. A filter can guarantee the character never reaches you. It cannot rewrite the sentence the way a careful writer would, and a comma where a dash stood can read worse. That is why the filter is the second layer, not the first. The instruction does the real work of writing well; the filter only catches what slips.
Make the next edit fail, not the reader.
Rules erode through edits. Someone updates the knowledge base, pastes a paragraph from a draft, and the character is back in the very text the model learns its tone from. So the last layer is a test, run with the rest of the desktop suite:
- Solace's knowledge base must contain no em dash, and neither may its rules.
cleanReplymust turn the sample above into commas, and no output may contain the character.- The Lotus skill file must contain zero, with the message “the skill itself must contain zero em-dash characters”. Another test checks that invoking Lotus still carries the ban section into the prompt.
A skill that bans a character while containing it teaches the model the opposite of what it says. The test makes that impossible to ship by accident.
No test, no rule.
Writing this post, we checked everywhere the rule is supposed to hold. The result is a useful map of what code enforces and what memory does not.
| Surface | Ask | Rewrite | Check |
|---|---|---|---|
| Solace answersWhat the helper says to you | |||
| Solace rules and knowledge baseWhat the helper reads | |||
| Lotus skill textWhat the model reads for UI work | |||
| UI copy a model writes with LotusOutput lands in your files | |||
| Help text inside the appHand-written strings | |||
| Marketing site pagesHand-written copy |
The bottom two rows are where it broke. The in-app help for the Lotus ability itself, the very skill that bans the character, describes Lotus with two em dashes. And on the day we checked, the site's hand-written pages still carried 48 of them outside comments and scripts, including in the home page title. The August purge fixed what it found. Nothing stopped the next one.
That is the lesson, and it is not about punctuation. A rule you want to hold on model output needs the same things as a rule on code: say it clearly, enforce it where the output leaves the system, and add a check that fails before a person ever sees the mistake. Everywhere we did all three, the count is zero. Everywhere we relied on remembering, it is not.
Two places to see it.
- 1Press ⌘K, type //ask, or open your avatar menu to talk to Solace. Its answers are the ones that pass the filter.
- 2Type //lotus followed by a UI task in any session. The skill's ban section and pre-flight check go to the model with your request.
Checked, and not claimed.
What this post does not claim
- That the em dash proves a text was written by AI. It does not, and plenty of good writers use it.
- That the filter improves writing. It removes one character; sometimes the sentence reads worse.
- That every model output in Luminair is filtered. Only Solace's replies are.
- How often models ignore the instruction. We have not measured it.
Sources
- TechCrunch · 14 November 2025OpenAI says it's fixed ChatGPT's em dash problem
- Tom's Guide · 17 November 2025Goodbye, em-dash! ChatGPT finally lets users disable its most annoying writing habit
- PCWorld · 19 November 2025OpenAI has fixed ChatGPT's infamous 'em dash' obsession (somewhat)
Ask Solace anything
Press ⌘K in Luminair. You will not find a single long dash in the answer.