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
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.
About
Reviews
Write a reviewNo 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
- 0.570score
board-setup
pmvanev
Use when recording a repo's issue-board constants in its `CLAUDE.md` — the forge and repo, the project and Status field ids, every option id, the enabled…
SkillAFreshness: AClaude Code +9 - 0.570score
issue-board
pmvanev
Use when driving a GitLab or GitHub issue tracker or board from the command line with `glab` or `gh` — moving a card between board columns, reordering a…
SkillAFreshness: AClaude Code +9 - 0.570score
nwave-slice-status
pmvanev
Use when the user asks where an nWave feature stands — "how many steps are in this slice", "which ones are done", "which one are we on", "what's next", "is…
SkillAFreshness: AClaude Code +9 - 0.570score
board-snapshot
pmvanev
Use when asked where an issue board stands right now rather than what is wrong with it — "summarise my board", "what's on the board", "where does the board…
SkillAFreshness: AClaude Code +9 - 0.566score
groom-issues
pmvanev
Skill bundle for the phil:groom-issues, phil:groom-fix, phil:groom-set and phil:groom-ask commands — reads a whole issue board in one list call per forge —…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-wave-summary
pmvanev
Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle"…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-issue-board
pmvanev
Use for any GitLab or GitHub board or tracker work in an nWave repo — one holding `.nwave/` or `docs/feature/` — including putting a feature on the tracker as…
SkillAFreshness: AClaude Code +9 - 0.565score
adversarial-review
pmvanev
Skill bundle for phil:adversarial-review command — a general-purpose independent adversarial critic.
SkillAFreshness: AClaude Code +9 - 0.565score
edd
pmvanev
Skill bundle for phil:edd command — Expectation-Driven Development front-door.
SkillAFreshness: AClaude Code +9 - 0.565score
red-team-prose
pmvanev
Skill bundle for phil:red-team-prose command — reviews a doc, README, or release note for AI-generated tells, Elements of Style clarity, and fitness for its…
SkillAFreshness: AClaude Code +9 - 0.561score
redesign-tests
pmvanev
Skill bundle for phil:redesign-tests command — human-approved, behaviour-changing test redesign loop with a coverage-equivalence claim per rewrite
SkillAFreshness: AClaude Code +9 - 0.561score
refactor-loop
pmvanev
Skill bundle for phil:refactor-loop command — gated closed-loop refactoring with a separate proposer and correctness critic, hard test gates, and a DAG ledger
SkillAFreshness: AClaude Code +9
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
- Repository
- github.com/pmvanev/phil-claude-plugin
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from pmvanev
- 0.570score
issue-board
pmvanev
Use when driving a GitLab or GitHub issue tracker or board from the command line with `glab` or `gh` — moving a card between board columns, reordering a…
SkillAFreshness: AClaude Code +9 - 0.570score
board-setup
pmvanev
Use when recording a repo's issue-board constants in its `CLAUDE.md` — the forge and repo, the project and Status field ids, every option id, the enabled…
SkillAFreshness: AClaude Code +9 - 0.570score
board-snapshot
pmvanev
Use when asked where an issue board stands right now rather than what is wrong with it — "summarise my board", "what's on the board", "where does the board…
SkillAFreshness: AClaude Code +9 - 0.570score
nwave-slice-status
pmvanev
Use when the user asks where an nWave feature stands — "how many steps are in this slice", "which ones are done", "which one are we on", "what's next", "is…
SkillAFreshness: AClaude Code +9 - 0.566score
groom-issues
pmvanev
Skill bundle for the phil:groom-issues, phil:groom-fix, phil:groom-set and phil:groom-ask commands — reads a whole issue board in one list call per forge —…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-issue-board
pmvanev
Use for any GitLab or GitHub board or tracker work in an nWave repo — one holding `.nwave/` or `docs/feature/` — including putting a feature on the tracker as…
SkillAFreshness: AClaude Code +9
Cite this page
ai-eos skill. Agent Mart. https://agentmart.dev/skills/pmvanev-ai-eos (last updated 2026-10-24)