Official agent skill

Writing Style

by pydantic in pydantic/monty

How to write prose that reads like human technical documentation rather than LLM output.

OfficialMITAuto-check passedDevelopment

Install Writing Style

skills CLI
$ npx skills add pydantic/monty --skill writing-style -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install pydantic/monty writing-style --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/pydantic/monty.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/writing-style .claude/skills/writing-style && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
writing-style
GitHub stars
8.6k
Token cost
~3.2k tokens
SKILL.md length
1,740 words
Files
2
Skills in repo
9
Repo updated
First seen
Licence
MIT

At a glance

How to write prose that reads like human technical documentation rather than LLM output.

  • Editing docstrings
  • SKILL.md covers Tells to avoid, Smoothness, Industry metaphor and Structure, plus 2 more sections
  • Runs Python scripts from its folder; calls python and python3
  • Limitations/ docs

What it does

Writing Style is an agent skill from pydantic/monty, published by the product's own GitHub organization. How to write prose that reads like human technical documentation rather than LLM output. Use whenever writing or editing docstrings, comments, limitations/ docs, READMEs, commit messages or PR descriptions, and when prose reads as smooth, salesy or generic.

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `rewrap_md.py`).

It sits in Development, covering Technical documentation, Brand voice and tone and Pull requests. The repository describes itself as: A minimal, secure Python interpreter written in Rust for use by AI. The licence is MIT.

When your agent uses it

  • Editing docstrings
  • Limitations/ docs
  • Commit messages
  • PR descriptions

Example prompts

  • “/writing-style”

Requirements

  • Python 3

What it can do on your machine

Read from SKILL.md and the folder at commit 5915273. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Writing Style loads about 3.2k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,740 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from pydantic/monty at commit 5915273, republished under its MIT licence (© pydantic). 1,740 words, ~3,211 tokens.

Download SKILL.mdSave it as .claude/skills/writing-style/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
writing-style
description
How to write prose that reads like human technical documentation rather than LLM output. Use whenever writing or editing docstrings, comments, limitations/ docs, READMEs, commit messages or PR descriptions, and when prose reads as smooth, salesy or generic.

Writing style

Applies to prose written in this repo: docstrings, comments, limitations/, READMEs, commit messages, PR descriptions, and warnings like the one on MountDir.

The reader is an engineer looking for a fact. Give them the fact. You are not persuading or building to a conclusion: say what happens, when, and what it costs.

Tells to avoid

Significance instead of mechanism

The most common LLM tell. If a sentence would fit unchanged in any other project's docs, it carries no information.

  • ✗ "This ensures the sandbox remains secure."

  • ✓ "Every operation runs relative to a Dir opened at mount time, so .. and symlinks cannot reach outside it."

  • ✗ "Resource limits provide robust protection against runaway code."

  • ✓ "The VM polls allocator usage every 255 instructions; crossing the allocator's hard limit exits the worker with OOM_EXIT_CODE."

Throat-clearing

Openers that delay the sentence: "It's worth noting that", "It's important to understand", "In essence", "Simply put", "At its core", "Let's take a look at". Delete them; the sentence underneath is the content.

  • ✗ "It's worth noting that overlay writes are discarded when the feed ends."
  • ✓ "Overlay writes are discarded when the feed ends."
The "not just X, but Y" reveal

Building to a payoff is an essay move. Docs do not need one.

  • ✗ "heap.rs isn't just another module — it's the foundation of the entire safety model."
  • ✓ "heap.rs contains the unsafe code that HeapReader soundness depends on. Changes need explicit review."
Adjectives doing the work of facts

"Powerful", "seamless", "robust", "elegant", "blazing fast", "significantly", "dramatically". Replace with a number, a mechanism, or nothing.

  • ✗ "Overlays are capped at a reasonable size."
  • ✓ "memory_usage_limit caps retained overlay data at 100 MB by default; exceeding it raises MemoryError in the sandbox."
Restating what the reader can see

A docstring that repeats the signature wastes the line it occupies. Say why it exists, what it costs, or where it bites.

  • ✗ "Adds a mount to the mount table." (on MountTable::mount)
  • ✓ "Opens the host directory once; later operations run against that descriptor, so renaming the path afterwards does not detach the mount."
Summarising yourself

Do not close a section by restating it, and do not announce what the next section will do.

  • ✗ "In summary, mounts are confined structurally rather than by checking."
  • ✓ (nothing, you already said it)
War stories

Provenance is worth a clause only when it changes what the reader does. How the bug was found usually does not.

  • ✗ "This was demonstrated against a live deployment during Hack Monty, where sandboxed code wrote dataclasses.py and the client executed it during ordinary result conversion."
  • ✓ "Sandboxed code can write json.py into a read-write mount, or any module not yet imported, and have the host's next import run it, including imports pydantic_monty makes itself."

Smoothness

A different failure from the tells above. Those pad out empty content; this dresses up real content, which makes it harder to spot and easier to approve.

Sentences engineered for rhythm read as conclusions, so the prose sounds like it is arguing when it is only listing facts. Balanced clauses and a stressed last syllable make a sentence sound authoritative whatever it contains, so one fact wearing three clauses gets read as three facts. Reference prose usually ends flatly, on a qualifier or a noun phrase, because the writer stopped when the information ran out rather than when the cadence resolved.

Timing for suspense. Commas and subordinate clauses arranged to delay the point.

  • ✗ "The sandbox cannot execute what it writes, but your machine will, later, with your privileges, and the path from one to the other is easy to miss."
  • ✓ "Files written by sandboxed code stay on the host, where other programs may execute them."

Telling the reader how to feel. "you did not choose", "easy to miss", "without being asked", "often does". These supply a mood in place of a fact.

  • ✗ "sys.path[0] is a directory you did not choose."
  • ✓ "sys.path[0] is the script's directory, or the cwd for python -m, python -c and the REPL."

Triples and reversals. A three-item list where one item carries the fact, then a but clause positioned as the payoff.

  • ✗ "Sandboxed code reads, writes and deletes normally and sees its own changes, but nothing reaches your disk."
  • ✓ "Writes are kept in memory and discarded when the feed ends. Sandboxed code still sees its own writes."

The quotable closer. A generalisation at the end of a section, memorable, carrying no new fact. Delete it. The section ends at its last fact.

  • ✗ "Principles alone produce prose that follows the rules and still reads like an LLM."
  • ✗ "Most drafts get better by deleting the first sentence and the last."

Symmetry for its own sake. Three-item lists where two items are real, paragraphs of matched length, every bullet opening with a bolded term. If the shape came first and the content was fitted to it, cut back to what is true.

Three checks:

  • Does the sentence end on a beat? If the last three words could be duller without losing meaning, they were there for rhythm.
  • Strip the rhythm and count the facts. One is the usual answer.
  • Is the sentence about the system, or about how the reader should feel?

Industry metaphor

Software described as objects moving through space, or as people with intentions. It is the register of a startup design review, not of reference documentation; CPython's docs use plain verbs throughout ("raises", "returns", "is stored in", "propagates", "Changed in version 3.11").

The metaphor also deletes the mechanism. "The error surfaces" does not say whether it raises, returns or logs. "Wire the tracker through" does not say parameter, field or global. "It lands in 3.14" does not say merged or released.

Motion and logistics:

Instead ofWrite
lands, landingmerged, released in 3.14
ship, shippingrelease
spin up, stand upstart, launch
wire up, plumb throughpass, connect
thread X throughpass X as a parameter
bubble uppropagate, or name the caller
surface (verb)raise, return, report, log
hand back, hand offreturn, transfer
bake in, baked intobuilt in, compiled in
punt ondefer, skip, leave to

Structure as furniture:

Instead ofWrite
seaminterface, boundary
surface, surface areaAPI, the public functions
escape hatchoverride, opt-out
knobs, dialsoptions, settings
load-bearingrequired, relied on by X
X-shapedwith the same interface as X
lives inis defined in, is stored in
sits on top ofwraps
under the hoodinternally

Code with intentions:

Instead ofWrite
the checker is happythe check passes
knows about, is aware ofreads, checks, has a field for
talks tosends requests to
teach the parser toadd X to the parser
wants, expects (of code)requires
reaches intoaccesses, reads

Also: "for free", "just works", "out of the box", "first-class", "table stakes", "opinionated", "non-trivial", "unlock", "blast radius", "paper over".

In prose:

  • ✗ "Errors from the worker surface to the caller."

  • ✓ "Checkout::feed returns PoolError::Crashed when the worker exits without a FatalError event."

  • ✗ "The tracker is threaded through the whole VM."

  • ✓ "Every allocation path takes &ResourceTracker as a parameter."

  • ✗ "WorkerTransport is the NativeSession-shaped seam."

  • ✓ "WorkerTransport has the same methods as NativeSession, so session.ts drives either one."

Terms of art stay, even though they began as metaphors: heap, stack, pointer, hot path, propagate, boilerplate, tombstone, sandbox escape, attack surface. CLAUDE.md also sanctions foot-gun, happy path and single source of truth. The test is whether a plain verb would say more than the metaphor does.

Show full SKILL.md (519 more words)Show less

Structure

  • Lead with the fact, not the context. First line of a docstring says what the thing is.
  • Prose for reasoning, bullets for actual lists. A bulleted paragraph is harder to read, not easier.
  • One idea per sentence. Split anything over about 30 words.
  • Comments and field docs: 1 line, 3 at most. Function and struct docstrings: 5 lines or fewer. If the docstring is longer than the code, something is wrong with one of them.
  • Warnings: the command or condition first, then the consequence and the subtle path to it, then the safe alternative. No preamble. Put the warning before the thing it warns about, not after.
Markdown line wrapping

Hard-wrap markdown at 120 characters, one sentence per line where possible: each sentence starts a new line, and only a sentence longer than 120 characters wraps onto continuation lines. This keeps diffs one-sentence-sized — editing a sentence does not rewrap the paragraph around it.

Continuation lines of a list item are indented to the content column of the marker. Code blocks, tables and headings are never rewrapped; a table whose rows cannot fit 120 characters should become a list instead.

To reformat an existing file: python3 .claude/skills/writing-style/rewrap_md.py <file>... (rewrites in place, skips fences/tables/headings/frontmatter).

Words and punctuation

Instead ofWrite
utilize, leverageuse
in order toto
serves as, acts as, functions asis
prior to, subsequent tobefore, after
a variety of, a number ofseveral, or the number
allows you to, enables you toyou can, or the imperative
is responsible for handlinghandles

One term per concept. Choose the word and keep it. Alternating between worker, child and subprocess for one thing makes the reader stop to check whether they are the same thing. Consistency beats variety.

  • ✗ "The checkout feeds the child, and the worker replies with events."
  • ✓ "The checkout feeds the worker, and the worker replies with events."

Noun clusters: three words at most. Longer stacks make the reader guess which noun modifies which.

  • ✗ "parent-side mount table memory usage limit"
  • ✓ "the memory limit for a parent-side mount table"

Active voice and simple tenses. Use the passive only when the actor is unknown or irrelevant. Do not drop articles or verbs to save space, except in the Rust convention of a subjectless first line ("Returns the host path.").

  • ✗ "A PermissionError will have been raised by the mount."
  • ✓ "The mount raises PermissionError."

Em dashes should be avoided, or used very sparingly. But do not update code just to remove em dashes.

Contractions are fine. Second person for user-facing docs ("you can never see the host path"), imperative for instructions ("mount a dedicated directory"). Hedges ("generally", "typically", "may") are for genuine uncertainty; if the behaviour is defined, state it.

Checking a draft

  • Could this sentence appear verbatim in another project's docs? Then it is empty.
  • Can you point at the code each claim describes? If not, you are guessing.
  • Delete the first sentence. Was anything lost?
  • Read it aloud. Sentences that sound like a conference talk get cut.
  • Strip a sentence's rhythm. How many facts are left?
  • Would a reviewer learn anything they could not get from the signature?

© pydantic, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .agents/skills/writing-style of pydantic/monty.

  • SKILL.md
  • rewrap_md.py

Open the folder on GitHubat commit 5915273

Compare with similar skills

Writing Style next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Writing Style compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Writing Style this skillpydantic/monty8.6k—~3.2kAutomated safety check: PassMIT
Writerrileyhilliard/claude-essentials130—~2kAutomated safety check: PassMIT
Plain Writingdocwriter-org/plain-writing-skill462—~3.6kAutomated safety check: PassMIT
Writing Styletimmo001/system-bridge356—~3.3kAutomated safety check: PassApache-2.0
Prosestatic-web-server/static-web-server2.4k—~971Automated safety check: PassApache-2.0
Agent Stylepchalasani/claude-code-tools2k—~1.4kAutomated safety check: PassMIT

Similar skills

  • Writer

    rileyhilliard/claude-essentials

    Writing style and tone guide for human-sounding content. An agent skill from rileyhilliard/claude-essentials.

    130 GitHub stars~2k tokensUpdated 1 mo ago
    Writing & ContentAuto-check passed
  • Plain Writing

    docwriter-org/plain-writing-skill

    Writes and edits prose in a plain and boring style: simple everyday words, complete sentences, no dashes, no jargon, and no analogies.

    462 GitHub stars~3.6k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Writing Style

    timmo001/system-bridge

    Write commit messages, PR and issue text and comments, docs (README), code comments, and user-facing strings (notifications, UI labels, toasts, error messages) in the project owner's voice: concise…

    356 GitHub stars~3.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Prose

    static-web-server/static-web-server

    Author or edit any prose for the Static Web Server (SWS) project — documentation, design docs, READMEs, PR descriptions, issue bodies, commit message bodies, or other human-readable text — following…

    2.4k GitHub stars~971 tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Agent Style

    pchalasani/claude-code-tools

    Literature-backed English technical-prose writing rules (agent-style, 21 rules).

    2k GitHub stars~1.4k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Prepare PR Files

    QwenLM/qwen-code

    Writes a PR title file and a template-filled PR body file from the current branch diff, without pushing, commenting or creating the pull request.

    28k GitHub stars~538 tokensUpdated today
    DevelopmentAuto-check passed

More from pydantic/monty

All 9 skills in this repo
  • Fix PR Comments

    pydantic/monty

    Official

    Read the review comments left by the known agent reviewers on the current PR, resolve and reply.

    8.6k GitHub stars~552 tokensUpdated yesterday
    Auto-check passed
  • Python Playground

    pydantic/monty

    Official

    Run and test Python code in a dedicated playground directory.

    8.6k GitHub stars~424 tokensUpdated yesterday
    Auto-check passed
  • Review General

    pydantic/monty

    Official

    Review the current branch against its merge base for bugs, CPython divergence, sandbox escapes, resource-limit escapes, performance regressions, verbose comments and missing ./limitations/ or docs/…

    8.6k GitHub stars~501 tokensUpdated yesterday
    Auto-check passed
  • Review Security

    pydantic/monty

    Official

    Security review of the current branch against its merge base — sandbox escapes, memory errors, panics and resource-limit bypasses.

    8.6k GitHub stars~852 tokensUpdated yesterday
    Auto-check passed
  • Review Usability

    pydantic/monty

    Official

    Check whether the common Python code an LLM would plausibly write still works on this branch, testing real cases in ./playground against CPython.

    8.6k GitHub stars~410 tokensUpdated yesterday
    Auto-check passed
  • Coverage

    pydantic/monty

    Official

    Fetch coverage diff from Codecov for the current branch or a specific PR.

    8.6k GitHub stars~282 tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Writing Style

What does Writing Style do?

How to write prose that reads like human technical documentation rather than LLM output. Writing Style is an agent skill from pydantic/monty, published by the product's own GitHub organization. How to write prose that reads like human technical documentation rather than LLM output.

When should I use Writing Style?

Writing Style fits situations like: editing docstrings; limitations/ docs; commit messages; PR descriptions.

How do I install Writing Style in Claude Code?

Run `npx skills add pydantic/monty --skill writing-style -a claude-code`. Or copy the skill folder (.agents/skills/writing-style in pydantic/monty) into .claude/skills/writing-style in your project. Claude Code loads it when a task matches its description.

How do I install Writing Style in Codex?

Run `npx skills add pydantic/monty --skill writing-style -a codex`. Or copy the skill folder (.agents/skills/writing-style in pydantic/monty) into .agents/skills/writing-style in your project. Codex loads it when a task matches its description.

Can I use Writing Style in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pydantic/monty --skill writing-style -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-style, .gemini/skills/writing-style, .github/skills/writing-style and .opencode/skills/writing-style in your project.

What does Writing Style need to run?

Going by SKILL.md and its folder, Writing Style needs Python for the scripts in its folder and the command-line tools its instructions call (python and python3). Our summary lists: Python 3.

Does Writing Style access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Writing Style safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Writing Style use?

Writing Style is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Writing Style use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Writing Style?

Skills that share tags, products or a category with Writing Style: Writer (rileyhilliard/claude-essentials, 130 stars), Plain Writing (docwriter-org/plain-writing-skill, 462 stars), Writing Style (timmo001/system-bridge, 356 stars) and Prose (static-web-server/static-web-server, 2.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Writing Style?

pydantic (a GitHub organization, an official publisher) maintains it in pydantic/monty, which has 8,607 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 9, 2026.

Source: pydantic/monty on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.