ai-tells
Skill0 starsChanged 2 months agoMITView on GitHub
Write and verify SEO title tags and meta descriptions, and catch AI-writing tells in body copy, using deterministic scripts instead of asking a model to count or self-police. Use when writing or auditing title tags and meta descriptions, when checking character counts, when checking a set of pages for duplicate titles or descriptions, or when scanning a draft for phrases and punctuation that read as AI-written. TRIGGER on "title tag", "meta description", "SEO title", "character count", "duplicate titles", "AI tells", "does this read like AI", "em-dash check", "AI writing detector", "sounds like ChatGPT".
4 other projects use a version of this.
Adopted by
Most recently taken up by
- BrightfolkStudio/claude-skillstheir own version, first seen Oct 13, 2026
- sublimecoder/aiostheir own version, first seen Sep 18, 2026
- JetBrains/youtrackdbtheir own version, first seen Jun 19, 2026
- kdgbalmer/ai-tellstheir own version, first seen May 4, 2026
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- JetBrains/youtrackdb★ 443same name
- kdgbalmer/ai-tells★ 35same name
- sublimecoder/aios★ 2same name
- BrightfolkStudio/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 2 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 31
Always run these before approving copy: Never approve a character count you eyeballed, and never trust a model's own claim about its length …
- Very specific: line 55
Abbreviate where natural: Use &, not "and". You are buying characters.
- Distinctive: line 57
Title Case: No exclamation points, no ALL CAPS, no emojis, and no double quotes, since quotes break the HTML attribute.
- Very specific: line 60
Every page gets a unique title: Run a batch through --title-file and the script fails on duplicates.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
SEO copy check
Two deterministic scripts plus the rules they enforce. The point is that a model cannot reliably count characters or notice its own habits, so those two jobs get handed to code.
Both scripts are Python 3 standard library only. No install, no dependencies.
The tools
python3 scripts/check_lengths.py "Emergency Plumber Marietta | Acme Plumbing"
python3 scripts/check_lengths.py --meta "Your description here."
python3 scripts/check_rules.py --title-file titles.txt
python3 scripts/check_rules.py --banned-file draft.mdBoth exit 0 on pass and 1 on failure, so they drop into a pre-publish check.
Always run these before approving copy. Never approve a character count you eyeballed, and never trust a model's own claim about its length or its phrasing.
Title tags
Length: 60 characters on the keyword portion. The appended company name does not count,
because Google usually strips the brand from the visible SERP title. check_lengths.py
splits on the last | and judges only the left side. This is the single most common thing
people get wrong: they count the whole string and needlessly cut real keywords.
Format: Keywords | Company Name
Keywords plus small connectors only (for, &, to). No benefit or ad-copy phrases.
"To help you get found" and "that grows your business" belong in the meta description, never
in the title.
Front-load the focus keyword where it reads naturally. Google truncates the visible title, so the term that matters most should land early. It still has to read as a real phrase, not a keyword list.
No repeated words, with the company name exempt. Distinct synonyms that are their own real
searches are encouraged (lawyer / attorney / law firm). check_rules.py --title warns on
repeats and skips the brand.
Abbreviate where natural. Use &, not "and". You are buying characters.
Title Case. No exclamation points, no ALL CAPS, no emojis, and no double quotes, since quotes break the HTML attribute.
Every page gets a unique title. Run a batch through --title-file and the script fails on
duplicates.
Exactly one <title> tag per page. The browser tab shows only the one Google picked, so
it hides the problem. Search the page source for <title and confirm a single hit. A page can
pass every other check here and still show the wrong title for this one reason.
Homepage: your highest-value title. Lead with the primary service or keyword plus the brand. Do not waste it on "Home" or a vague tagline.
Large catalogs: hand-write the homepage, top categories, and priority products. For the long tail use a template filled from product data, varied enough that titles are not boilerplate differing by one word.
Meta descriptions
Length: 160 characters. Mobile truncates around 120, so the keyword and the main hook belong in the first 120. The most expendable element goes last, so it is what gets cut.
Read the live page first. Pull the hook from the actual content. Do not invent details, and do not copy the first sentence and append "Learn more."
Lead with the benefit, not the keyword. Front-loading means the keyword lands within the first 120 characters, not that it is the first word. Open with a benefit, a pain point, or a differentiator and let the keyword fall in naturally. Vary your openings across pages, and never reuse a "[keyword] that..." skeleton.
Omit the company name. Google appends or strips the brand in SERPs, so spending characters
on it wastes them. check_rules.py --meta --company "Name" fails on this.
Do not repeat the title tag. The description complements it, it does not echo it.
Voice: third person for the descriptive part. Imperative calls to action are encouraged ("Call today", "Shop now", "Get a free quote"). Match the call to action to the page type.
Local and service pages: include the target city.
No double quotes and no exclamation points. Both are checked.
Write complete sentences, and do not use dashes as connectors. See below.
AI-writing tells in body copy
python3 scripts/check_rules.py --banned-file draft.md
cat draft.md | python3 scripts/check_rules.py --bannedTwo categories, both hard failures:
Phrases. A list of words and constructions that cluster heavily in machine-written copy:
delve-adjacent vocabulary like "meticulous", "navigating", "complexities", "realm", "bespoke",
"tailored", "robust", and stock scaffolding like "when it comes to", "in the heart of",
"unlock the secrets", "designed to enhance". The list lives at the top of check_rules.py.
Edit it to taste. None of these words are crimes on their own, but a draft carrying six of
them reads as generated to anyone who reads a lot of copy.
Dash punctuation. The em-dash and the en-dash used as a pause device are among the most recognizable tells. Rewrite with a comma, a period, a colon, or parentheses. Hyphens inside compound words (same-day, family-owned, 24-hour) are not counted and are always fine.
One caveat worth stating plainly: this is a lint, not a verdict. It catches habits, it does not judge whether the writing is good. Passing it does not make copy worth publishing.
Suggested workflow
- Draft the title and description against the rules above.
check_lengths.pyfor real counts.check_rules.pyfor repeats, brand leaks, forbidden characters, and duplicates across the batch.check_rules.py --banned-fileon any body copy going out with it.- Fix every FAIL. Warnings are judgment calls.
- Publish, then load the live page with a cache-buster (
?v=1) and confirm the rendered tag matches what you entered. Caches, plugins, and themes override these more often than you would expect.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

