Agent skills
Make your agent write more like a human
Ask a coding agent for a README, a status report, or a commit body, and you get AI slop that is hedged, padded prose, fond of the words AI overuses and closing lines that sound profound and say nothing. This article shows one way to replace that default with writing that reads more like an engineer wrote it, using the published style guide packaged as a skill.
Why does AI writing sound like AI?
Four habits mark machine-written technical prose, and each has a specific fix.
| Habit | Example | Fix |
|---|---|---|
| The aphorism | "Tests are the specification" | State the claim it replaced: "the test names describe the intended behavior" |
| Filler vocabulary | leverage, robust, seamless, just, simply | A word list, and one rule: never call anything simple or easy |
| The missing gap | Lists what worked, silent on what was skipped | Fix the order: what is true now, what changed, what is undone and why |
| Preamble | "Great question." "You're absolutely right." | Ban praise as an opener |
If a reader cannot disagree with a sentence, that sentence carries no information, and a summary built from such sentences tells you almost nothing relevant.
Why use Google's published guide
You can write your own rules and maintain them, and get a register that fits you exactly. The other option is a guide someone else maintains. The Google developer documentation style guide is public, and every rule in it has a URL. When you and the agent disagree about a sentence, you settle it by citation instead of by taste.
It is also opinionated enough to change what an agent writes. Here is how it sets the register:
| Too informal | Right | Too formal |
|---|---|---|
| Dude! This API is totally awesome! | This API lets you collect data about what your users like. | The API documented by this page may enable the acquisition of information pertaining to user preferences. |
| Nailed it, tests are green | All 34 tests pass. Two were already failing on main, so I left them. |
Test execution completed with satisfactory results. |
The second row is a case the guide itself does not cover, an agent reporting on work it has just completed, which is covered by an extension in the section "Reporting your own work."
How a skill works, and what it costs
A skill is a directory, not a file. Its name is the skill name, kebab-case, and it holds a SKILL.md plus a references/ folder if you split it:
plain-prose/
├── SKILL.md # required, and the only file that loads on trigger
└── references/ # optional, each file read only when its topic comes up
├── grammar.md
├── mechanics.md
├── ...
└── word-list.md
SKILL.md carries a name and a description. The description is the trigger surface, so it has to name the situations rather than the topic, and only when it matches does the body of the file enter the context. You can also start it yourself, by naming the skill and handing it the work.
There is no mechanism behind the reference files. SKILL.md carries a table of topics and relative paths, under one instruction: read the file for the topic at hand, not all of them. The harness tells the agent which directory the skill lives in, the agent already has file access, and it joins the two. That is the entire loading model.
Nothing enforces the references/ name and nothing parses the table, so a path that does not exist fails silently rather than erroring.
So the cost comes in three tiers and only the first is always paid. The description is what the agent reads to decide whether the skill is relevant. On a match, the body of SKILL.md loads: that is the activation cost. A reference file loads only when a request touches its topic, which for most requests is never.
The skill this page publishes is SKILL.md plus eight reference files, 1,658 lines together, of which SKILL.md is 110. Activating it costs 110 lines and puts 1,658 within reach. What applies to every sentence goes in SKILL.md, and anything scoped to one topic goes behind a pointer.
The part that does the work
A rule the agent cannot check is a rule the agent will not follow. In practice the shortest section changes the output most. It is a checklist, run against a draft that already exists:
- Any sentence a reader could not disagree with? Rewrite it as the claim it replaced.
- Outcome in the first sentence?
- Every heading a plain label, in sentence case?
- Any word from the slop list, any just, simply, leverage, robust, seamless?
- Passive voice where the actor matters?
- Any superlative or guarantee you cannot support?
- Anything asserted that you did not actually check?
- Anything you skipped that you have not admitted?
Every line is a yes or no question about text already in front of it, which is why it holds up against a real request.
The skill file
Where the directory goes depends on the tool, and on whether you want it everywhere or in one repository:
| Tool | For you | In a repository |
|---|---|---|
| Claude Code | ~/.claude/skills/ | .claude/skills/ |
| GitHub Copilot | ~/.copilot/skills/ | .github/skills/ |
| Kiro | ~/.kiro/skills/ | .kiro/skills/ |
| Codex, Gemini CLI, Goose | ~/.agents/skills/ | .agents/skills/ |
.agents/skills/ is the shared root: the tools on the last row all read it, and Copilot and Goose read .claude/skills/ as well, so a repository already set up for Claude Code is partly portable without moving anything.
Download the skill and reference files and place them in the appropriate location depending on your agent of preference.
Always read the skill before you install and use it.
- name
- plain-prose
- description
- Applies the Google developer documentation style guide to prose: plain, checkable technical English with no aphorisms, buzzwords, or filler. Use when asked for Google style or "the style guide", and when writing or reworking technical prose: a summary or status report, a findings list, a README, design doc, spec, or runbook, a commit body, a code comment, release notes, PR or issue text, or a draft written for the user. Also use when asked to tighten, proofread, or de-slop existing prose, or when asked why a sentence reads as AI-written. Not a global default: for informal or non-technical writing, follow the user's own register instead.
Prose conventions
Source: the Google developer documentation style guide. Each file under references/ names the guide pages it extracts, so a disputed rule is settled there, by citation. Rules marked "extension" are house additions, not the guide's. Guide content © Google, used under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/).
Register
The guide asks for "conversational, friendly, and respectful", like "a knowledgeable friend". Extension: aim instead at a senior engineer writing to a competent colleague, specific and unhurried, nothing staged for effect.
| Too informal | Right | Too formal |
|---|---|---|
| Dude! This API is totally awesome! | This API lets you collect data about what your users like. | The API documented by this page may enable the acquisition of information pertaining to user preferences. |
| Nailed it, tests are green | All 34 tests pass. Two were already failing on main, so I left them. | Test execution completed with satisfactory results. |
Avoid buzzwords, figurative language, pop-culture references, internet slang, and exclamation marks. Never call anything simple or easy. Extensions in the same spirit: no emoji, and no praise as preamble ("Great question", "You're absolutely right").
Don't compress a finding into an aphorism (extension)
A technical summary needs statements the reader can test against the code.
| Aphorism | Claim |
|---|---|
| Data flows in one direction | Reducers are the only place state changes |
| Tests are the specification | The test names describe the intended behavior |
| Errors are values, not events | Failures are returned, not thrown |
| Boundaries carry the contract | The boundary validates input; nothing below it does |
If a reader can't disagree with the sentence, it carries no information. This covers headings, bullet summaries, closing lines, and titles. A heading labels the section it opens.
Reporting your own work (extension)
First person for what you did, past tense; present tense for the behavior that resulted: "I changed both call sites. The retry count is read once." Lead with what is true now, then what changed, then what you left undone and why. If you don't name a gap, the reader assumes there isn't one.
Sentences
- Active voice, and name who acts.
- Present tense. Reserve
willfor something that genuinely happens later. - No em dashes (extension). Use a comma, a colon, parentheses, or two sentences.
- Conditions before instructions: "To delete the document, click Delete."
- Second person. Address the reader as "you", not "the user".
- Under 26 words. Cut
in order tototo,make use oftouse,a number oftosome. - No anthropomorphism. Software doesn't want, think, know, or try.
- Put
onlynext to what it limits: "Request only one token." - Keep
then,that,of. Two characters, and they save a re-read. - No ambiguous pronouns: "the text doesn't change", not "it doesn't change".
- No directional references. "The preceding section" survives a re-layout, "above" doesn't.
- Two nouns of modifier stacking, maximum, unless three is the established name of the thing (payment retry queue).
Paragraphs and order
Most important information first, in the paragraph and in the reply. One idea per paragraph. Past five or six sentences, look for the second idea. A one-sentence paragraph is fine.
References
Read the file for the topic at hand, not all eight.
| Topic | File |
|---|---|
| Voice, tense, person, pronouns, agreement | references/grammar.md |
| Capitalization, punctuation, numbers, dates, units | references/mechanics.md |
| Words to avoid, jargon, inclusive language, the slop list | references/word-list.md |
| Headings, lists, procedures, notices, tables, links | references/documents.md |
| Code font, code samples, command syntax, placeholders | references/code.md |
| Claims, must/should/can, superlatives, verified versus assumed | references/claims.md |
| Product names, trademarks, filenames | references/names.md |
| Markdown versus HTML, semantic tagging | references/markup.md |
Before you send
- Any sentence a reader couldn't disagree with? Rewrite it as the claim it replaced.
- Outcome in the first sentence?
- Every heading a plain label, in sentence case?
- Any word from the slop list, any
just,simply,leverage,robust,seamless? - Passive voice where the actor matters?
- Any superlative or guarantee you can't support?
- Anything asserted that you didn't actually check?
- Anything you skipped that you haven't admitted?
The eight reference files
The single file covers every sentence. The eight reference files exist because most style rules are scoped to one kind of writing, and loading all of them for every request would waste context.
Each one extracts a part of the guide, so each is checkable against a URL. Each row below downloads one file, and the archive holds all eight under references/, which is where the skill layout wants them.
| File | Covers |
|---|---|
grammar.md | Voice, tense, person, pronouns, agreement, plurals, contractions, articles |
mechanics.md | Capitalization, punctuation, numbers, dates, units, abbreviations |
word-list.md | Words to avoid, jargon, inclusive language, the slop list |
documents.md | Headings, lists, procedures, notices, tables, links, figures |
code.md | Code font, samples, command syntax, placeholders, API reference comments |
claims.md | must/should/can, superlatives, pre-announcements, verified against assumed |
names.md | Product names, trademarks, filenames and file types |
markup.md | Markdown against HTML, semantic tagging |
All eight were extracted on 1 August 2026, and each section names the guide page it extracts.
The guide is revised continuously and it is the authoritative text, so open the cited page when a rule carries real weight.
Keep it about sentences
Notice that naming conventions for a stack, the difference between a package and a module, and which specification name is current are all real and useful, and none of them belong in a skill about prose. Vocabulary for one language changes on that language's schedule, and mixing it in means every request pays for rules it cannot use. It belongs in its own skill, which is also where it can be maintained by whoever knows that language.
The same split works upward. A prose skill governs the README while a language skill governs the code in the same commit, and neither has to know about the other. Split by material, not by project.