Skip to content
Agentmart
Submit a tool

ai-eos

Skill bundle for phil:ai-eos command — detects the stylistic tells that mark technical prose as AI-generated, with a density verdict and ranked findings.

Skill by pmvanev

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/pmvanev-ai-eos

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Skill bundle for phil:ai-eos command — detects the stylistic tells that mark technical prose as AI-generated, with a density verdict and ranked findings. Reports only; never edits.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/ai-eos

What's inside

Skill name
ai-eos
Description
Skill bundle for phil:ai-eos command — detects the stylistic tells that mark technical prose as AI-generated, with a density verdict and ranked findings. Reports only; never edits.
License
MIT
Instructions
231 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# AI Elements of Style

Hunt the stylistic tells that mark a piece of technical prose as AI-generated, and report them. Edit nothing.

The counterpart to `eos`: where `eos` holds prose to Strunk & White, this holds prose to the tells that a machine wrote it. Same target, different standard.

Invoked directly as `/phil:ai-eos`, or as one of the three passes in `/phil:red-team-prose`, which adds an `eos` clarity pass and a document-fitness pass over the same text.

Take an adversarial stance: assume the text is trying to pass as human-written and look for what gives it away. But hold the opposite discipline just as hard — **a tell is a specific span you can quote, name, and fix.** Vague suspicion is not a finding.

This skill owns **LLM tells only**. Clarity, concision, and voice belong to `eos`; document fitness for audience and purpose belongs to `${CLAUDE_PLUGIN_ROOT}/rules/technical-communication.md`; comment quality belongs to `clean-comments`. Do not review against those here.

**Density beats any single token.** The sources cited below all treat frequency, not single tokens, as the signal. One "pivotal" proves nothing; four mechanisms clustered in one paragraph is damning. Lead with the density verdict, then the spans.

## Sources

The catalog below summarizes [Wikipedia's *Signs of AI writing*](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) (WikiProject AI Cleanup, CC BY-SA), the excess-vocabulary measurements in Kobak et al., *Delving into LLM-assisted writing in biomedical publications through excess vocabulary* (Science Advances, 2025) and Liang et al., *Mapping the Increasing Use of LLMs in Scientific Papers* (COLM, 2024), and George Orwell's "Politics and the English Language" (1946) on the dying metaphor and the ready-made phrase.

---

## Parse the Argument

Determine what `$ARGUMENTS` refers to:

| Pattern | Type | Example |
|---------|------|---------|
| `--changes` | Uncommitted changes | `--changes` |
| Digits separated by `-` or `:`, with an optional `lines:` prefix | Line range | `42-67`, `42:67`, `lines:42-67` |
| Has a file extension | File path | `README.md`, `docs/setup.md` |
| Ends with `/` or a directory with no extension | Directory path | `docs/`, `skills/` |
| No argument | Prose in the current context | — |

If the argument contains both a file and a line range (`docs/setup.md:12-30`), split them.

---

## Step 1: Gather the Prose

Review prose only. Skip code blocks, frontmatter, config, link URLs, and generated output. Review table cells only when they contain sentences.

### `--changes`
Run `git diff --name-only HEAD` to list files with uncommitted changes, filter to prose files (`**/*.{md,txt,rst}`), then run `git diff HEAD -- {file}` per file to get the hunks. Review only the added and modified lines — but read the whole file for context, since density is a property of the passage, not the diff. The density denominator is the reviewed lines, not the file. Pass `git diff` neither `--output` nor `--ext-diff`: the first writes any path, the second runs a repo-configured diff driver, and this command declares `mutates: false`.

### Line Range
Read the file with surrounding context. Review the selected block only.

### File Path
Read the entire file.

### Directory Path
Glob recursively for `**/*.{md,txt,rst}`. Review each.

---

## Step 2: Hunt the Tells

Two tiers. **Tells** are over-the-top enough to flag on a single occurrence. **Whiffs** are weak signals — flag them only when they cluster with tells or with each other.

For every finding, name the **mechanism** (why an LLM produces it), not just the phrase. The mechanism is what makes the finding actionable and what keeps the catalog useful as models change.

**Which tier a phrase belongs to follows one rule:** a bare single word lives in the whiff tier, because one correct use proves nothing; a multi-word construction lives in the tell tier, because the construction itself is the fingerprint. "Robust" is a whiff; "underscores the importance of" is a tell. The rule holds except where a tell names its own single words: #5 counts its verbs as a ratio, and #8 flags its words because the register, not the word, is the fingerprint.

### Tell tier — flag on sight

**1. Unearned significance**
Inflates a mundane fact into grand importance. The subject always "stands," "serves," or "plays a role" rather than simply doing something.

> "stands as a testament to" · "plays a crucial/pivotal/vital role in" · "underscores the importance of" · "marks a key turning point" · "reflects a broader shift toward" · "has become synonymous with"

*Fix:* cut, or replace the claim with the specific thing the subject actually does.

**2. Participle padding**
A trailing `-ing` clause bolted to a finished sentence, adding cadence and no information. The single most reliable tell in technical prose.

> "..., highlighting its importance in modern workflows" · "..., ensuring scalability and reliability" · "..., reflecting the team's commitment to quality" · "..., contributing to overall performance"

*Fix:* cut. If the clause carries a real claim, promote it to its own sentence with a subject.

**3. The formulaic closer**
A wrap-up that concedes a vague weakness and pivots to vague optimism. Often arrives unbidden at the end of a section that needed no conclusion.

> "Despite these challenges, [subject] remains well positioned to..." · "While not without limitations, ..." · "In conclusion," · "Overall," · "As the landscape continues to evolve, ..."

*Fix:* delete the paragraph. If a real limitation exists, state it plainly and stop.

**4. Phantom attribution**
Opinion attributed to an unnamed consensus, inflating one source — or zero — into a field.

> "Experts argue that" · "Observers have noted" · "Industry reports suggest" · "It is widely regarded as" · "Many developers find" · "Critics have pointed out"

*Fix:* name the source, or cut the claim. Flag this as **needs a fact you cannot supply** — never invent the citation.

**5. Copulative avoidance**
Systematic refusal of plain *is* and *has*. One instance is style; a pattern across a passage is a fingerprint.

| Tell | Plain form |
|------|-----------|
| serves as / functions as / acts as | is |
| represents / constitutes / embodies | is |
| marks / stands as | is |
| features / boasts / offers / maintains | has |
| enables / allows for | lets, or the actual verb |

*Fix:* use *is* and *has*. Count occurrences and report the ratio — that's the evidence. Report the ratio only; do not also file each avoidance as an individual finding unless it is the sole tell in the passage. (Bare "facilitate" as a fancy word belongs to `eos`, not here.)

**6. Negative parallelism**
Defines by contrast with a strawman, for rhythm rather than meaning.

> "not just X, but Y" · "not only X but also Y" · "it isn't about X — it's about Y" · "not a X, but a Y" · "X rather than Y" (when nobody proposed X)

*Fix:* state Y. Drop the contrast unless a reader would genuinely have assumed X.

**7. Rule-of-three padding**
Three coordinate items where one carries the meaning and two pad the cadence. Especially adjectives.

> "fast, reliable, and scalable" · "clear, concise, and actionable" · "designing, building, and maintaining"

*Fix:* keep the item that does work; cut the rest. Legitimate triads name three distinct things — flag only when the members are near-synonyms or the third is filler.

From pmvanev/phil-claude-plugin, MIT.

More from pmvanev/phil-claude-plugin

Signals

Stars
0
Forks
0
Open issues
10
Last commit (this folder)
Oct 13, 2026 (15 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from pmvanev

Cite this page

ai-eos skill. Agent Mart. https://agentmart.dev/skills/pmvanev-ai-eos (last updated 2026-10-24)