Dekita

Six checks that catch AI-sounding text before you publish

ai writing tooling

On 2026-09-20 I published my first article on a Chinese Q&A platform. The editor's content checker flagged seventeen places in the draft.

I assumed the writing was thin. I went through the flags one at a time and found the opposite. Every single one pointed at formatting: curly quotes used to emphasize nouns, bold scattered across the page, the whole piece laid out in a neat four-part structure. The checker never said a word about the argument itself.

That was the day I stopped treating "AI-sounding" as a matter of taste. What the platform was reacting to were specific, repeatable patterns. Patterns can be counted.

The four you can count

Language models pick up fingerprints from their training data. This particular model had six that were stable enough to use as a signature.

The first is curly quotes. People typing Chinese use straight quotes from the keyboard, or book-title marks in formal typesetting. Models reach for curly quotes to wrap nouns the way a magazine layout would. It shows up often enough to be a tell on its own.

The second is bold. Models like to bold the first phrase of every paragraph, which reads as emphasis even when nothing is being emphasized. In a short piece, three or more bolded runs is unusual for a human writer.

The third is the em dash. Chinese prose uses it sparingly. Past three in a thousand characters, you should be suspicious.

The fourth is the negation-then-pivot sentence. It kills a thing in the first clause, then resurrects another in the second. It reads smoothly in any language I have tried it in, which is exactly the problem. It is a template, and models reach for it far more than people do. I did not have to guess at this one: the platform lists that construction among its own optimization suggestions.

Four down. Two more that no script can see.

The fifth is paragraph rhythm. Real writing has ragged paragraphs, some two lines and some eight. Model output tends to land near the same length every time, and the page starts to sound like a metronome.

The sixth is how the piece ends. People often stop at a point with no conclusion, or hand you one small concrete action. Model output lands on an abstract summary.

Notice what the six have in common. None of them have anything to do with whether the content is any good. An article can be genuinely informative and commit all six.

Two layers of checks

The first layer is mechanical, and a script does it.

Mine scans four things: curly and square quotes, bold runs, em dash count, and negation-pivot sentences. The thresholds are tight. Zero quotes, at most two bold runs, at most two em dashes, at most one negation-pivot. It does not judge quality. It reports numbers.

The second layer is about whether the text reads like speech, and it runs off a rules table.

Mechanical checks miss a whole class of problems: sentences that run too long, one idea restated three times in different words, paragraphs that go a dozen lines without a break. I wrote those up as six rules with numeric thresholds in a separate document, and the script reads the document.

Keeping the numbers outside the code is a decision I would defend. Any threshold can be wrong. If it lives in a config file, someone can argue with it. If it lives in the source, it quietly becomes something nobody dares to touch.

Both layers run as one command before publishing and produce two reports. On the first run, the mechanical layer found seventeen issues in the previous draft. The readability layer found nineteen in a different one.

Three things that went wrong

Pitfall one: a passing check that scanned nothing

I once wrote the body into a fenced code block. The checker reported zero hits and a clean pass. That felt wrong, because the reported sentence count was far below my estimate. I saved the same text as a plain file and ran it again. Three problems surfaced immediately: two long sentences and a relative time phrase with no anchor date.

The checker skips code blocks by design, so it does not scan your shell commands. It cannot tell a code block from an article that happens to live inside one. The fix was not only to change the logic. I added a coverage guardrail: if the skipped blocks contain more than eighty CJK characters, the report prints a warning at the bottom saying this pass does not count. That guardrail matters more than any individual rule, because it is the one that catches a false pass.

Pitfall two: relative time words in published content

One draft headline said something happened "yesterday." That was true for anyone reading it that day. The content stays online for a long time, and in a week "yesterday" is simply wrong. The rule now is that any relative time word in published content has to carry a full date nearby, or it fails the check. Internal documents get a wider window, forty characters. Published content gets twenty.

Pitfall three: suspecting the checker before suspecting the thing it flagged

The self-check script once raised two overdue items. I spent a long time on them before realizing both were stale references. The dates they pointed at had been updated weeks earlier, and only the wording still held the old values. The checker had not misfired. It was reporting something other than what I assumed it was reporting.

The lesson is directional. A false positive costs more time than a miss, because a miss is a known gamble and a false positive sends you to fix something that was never broken.

Why this is worth two minutes

First, AI-sounding text is a set of concrete features, not a mood. Anything you can count, you can fix. If your only impression is that a paragraph feels slightly fake, you will never finish cleaning it, because you do not know which part to touch.

Second, machines check format and people check judgment. Four of the six rules above automate cleanly. Two require you to read the thing. Handing all six to a script is how you trade away the ability to notice.

Third, the cost you avoid is a repost. An article that gets downgraded for looking machine-generated loses more than the few words you would have edited. It loses the reach it would have had.

If you want to start today, take the last thing you wrote and do two counts on it. Number of curly quotes. Number of bold runs. Get both to zero and it will already read more naturally. Leave the other four for later.