- name
- docs-team-voice
- description
- Write or revise documentation prose so it reads like the rest of this site, in the docs team's shared voice. Covers sentence length, cross-link density, how to state defaults and conditions, naming exact identifiers, and what to cut in a revision pass. Use when drafting or rewriting a page, a section, a concept overview, a how-to, a callout, or landing copy.
# Write in the house voice
`AGENTS.md` holds the rules a linter can check: no contractions, no first
person, no future tense, sentence-case headings, Oxford commas, spacing around
dashes. Vale enforces most of them and `make lint_prose` is the gate, though
Vale does not scan inside JSX components such as `<Note>` and `<Tip>`, so a
clean run there proves nothing. This skill covers what a linter cannot check:
rhythm, density, and the shape of a sentence that carries information.
The targets below are measured from this repository's own pages, not invented.
## Keep sentences short
Median sentence length on this site is **13 to 15 words**. Roughly one sentence
in twelve runs past 25 words, one in forty past 30. Treat 25 as the point where
you look for a split and 35 as a defect.
One idea per sentence. When a sentence carries two, split it and let the second
stand alone.
> The agent definition selects the model and core capabilities of a managed deep
> agent.
> Set the `compression` field to control how exported Parquet files are
> compressed. When omitted, LangSmith uses `zstandard`.
The second example is two sentences where one long one would have hidden the
default inside a subordinate clause.
The target is a floor as well as a ceiling. Keep the condition, the actor, and
the exact value even when they push a sentence long, and split it rather than
dropping one of them to get under 15 words.
## Link about half the time
Close to half of all prose sentences here carry a link. Cross-linking is not
decoration: it is how a reader escapes a page that does not answer the question
they arrived with.
Link a term on first mention only. Pointing forward at the end of a section is
standard, and **two pointer forms are both established**:
> Refer to [Spend policies](/langsmith/llm-gateway-spend-policies).
> For the full project layout, see [Project
> structure](/langsmith/managed-deep-agents-project-structure).
Neither is canonical. Different authors favor different ones, so match the form
the page already uses and do not mass-convert one into the other.
## State defaults and conditions as bare facts
Put the trigger first, then the behavior. No hedging, no "please note".
> When omitted, LangSmith uses `zstandard`.
> Defaults to the last 7 days, newest first.
> Task planning is opt-in.
> Non-zero exits and timeouts from `--startup-cmd` warn but do not abort the
> session.
Constraints read the same way, as plain statements of fact rather than warnings
about them.
## Name the exact identifier
Backtick every field, flag, value, environment variable, and status. Between a
quarter and a half of prose sentences on this site contain one. Name the actual
value rather than gesturing at it: `zstandard`, not "the appropriate
compression"; `CREATED`, `RUNNING`, `COMPLETED`, not "the various statuses".
> If your API key is linked to multiple workspaces, specify the workspace in the
> header with `"x-tenant-id"`.
## Reach for a concrete example early
"For example" appears in roughly one sentence in thirty, almost always followed
by a real value rather than a shape.
> For example, in SCIM, the resolved `sub` claim and SCIM `externalId` must
> match in order for login to succeed.
If you cannot supply a real example, say less rather than inventing one. Never
fabricate a field name, a response body, or a policy detail to fill a slot.
## Address the reader, and prefer the active voice
Second person carries a quarter to a half of sentences, most heavily in
procedures and UI steps. Passive voice appears in only about one sentence in
eight, and usually where the actor genuinely does not matter.
> When viewing a trace that was generated by a run in LangSmith, you can access
> the associated server logs directly from the Details view.
Use the product name as the subject when the reader is not the actor: "LangSmith
uses `zstandard`", not "we use `zstandard`".
## Revision pass
Read the draft once looking only for these:
- **Sentences over 25 words.** Split, or cut a clause.
- **Hedges and filler.** "simply", "just", "very", "basically", "note that",
"be sure to", "in order to", "has the ability to". These are near-absent from
this site's prose, well under one percent of sentences. Delete or replace.
- **A spaced em dash.** `word — word` fails `LangChain.DashesSpaces` and blocks
CI. Prefer a comma, a colon, or two sentences, and reach for `word—word` only
when nothing else reads. A bold label opening a paragraph takes a colon:
`**Tier assignment**:`, measured at 177 uses in `src/` against 1 for the dash.
- **A vague identifier** where the exact one belongs.
- **A cut that took a fact with it.** A tightened sentence that lost its
condition, its actor, or its exact value reads cleanly and says something
else. Restore the fact and split the sentence.
- **A first mention with no link**, and repeat mentions that are linked again.
- **A claim you did not verify.** Check it against the source, or cut it.
- **A fact that disagrees with a related page.** Grep `src/` for the feature and
read the pages that cover it from another angle, such as a CLI reference or a
permissions table. The `docs-edit` skill covers what to look for.
- **An added "key features" list, or a horizontal rule** used to separate
sections. Neither belongs here.
Then run the gate:
```bash
make lint_prose FILES="<changed files>"
```
For a full review against the style guide, with the rule each finding breaks,
use the `docs-review` skill.
GitHubで見る