Use when writing or editing documentation pages (concept pages, how-to guides, API reference prose, tutorials) under docs/. Provides the writing style, voice, and structural rules for Agenta docs. Apply this skill before drafting any new docs page, and include it in the brief for any subagent tasked with writing docs.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
A short, living set of rules for writing documentation in this repo. Update as we learn what works.
This rule governs every other rule below. Every failure in a doc review traces back to breaking it.
Your reader is a stranger with a job to do. They are not your teammate, they did not read the PR, they do not know the codebase, and they do not care about your reasoning. They arrived with a situation and a question. Serve that, nothing else.
Some readers are agents, some are humans. Write for both: an agent needs unambiguous structure, a human needs to find their case fast. Neither needs your narration.
For anything non-trivial (a troubleshooting entry, a decision, a procedure with branches), give the reader these in order. Do not overdo it on simple content.
A section that says "enable the tunnel profile" without telling me how has skipped beat 3. A warning that does not tell me whether it applies to me has skipped beats 1 and 2.
Do not tell readers what they think, what they usually get wrong, or what their first question is. You do not know them, and the sentence serves you, not them.
Docs state facts and give instructions. They do not give advice you were not asked for, and they do not editorialize.
If a constraint is real, state it as a constraint ("the idle TTL must be below AUTOSTOP, or Daytona stops a sandbox the runner still holds"). That is a fact, not an opinion.
Cut anything that is not the reader's concern in their situation.
Ask of every sentence: in the situation this page is for, does the reader need this? If not, delete it or move it to reference.
If two options exist (Daytona and local; Compose and Helm), give them mirrored sections with the same sub-structure, in the same order, on every page. A reader learns the shape once and then navigates by it.
"Add your dependencies" tells the reader nothing. Name a plausible thing and show the line. The reader adapts an example far faster than they invent one from a description.
dockerfile_commands. For example, the gh CLI and Chromium: RUN apt-get install -y gh chromium."- /srv/repos/my-service:/agenta/workspaces/my-service:rw. Use :ro when they should only read it."Vague adjectives, especially security ones, make the reader guess. Say the condition that is actually true.
If the answer is "go read that other page", write one sentence with the link where the reader hits the question. Do not give it a heading and three paragraphs of setup. A section promises content.
Add a slug: to a page's frontmatter only when the file moved and the old public URL must keep
working, or when the natural path is wrong. Never add one just because other pages have one.
Prose discipline is not enough. An instruction you did not check is a lie with good grammar, and it costs the reader an afternoon.
Before you write "set X in your values file", open the chart and confirm the key exists. Before you
write "add a COPY step", confirm the build has a local context. Before you name an env var,
confirm the code reads it. Before you claim "everything else is documented above", go count.
Real failures caught in review, all of which read fluently:
values.schema.json has no volumes key. The instruction is impossible.COPY step." The snapshot recipe uses dockerfile_commands() with no
local build context, so COPY cannot work. RUN git clone can.If you cannot verify a claim, do not write it. Cut it, or go read the code.
A prerequisites list is what EVERY reader needs before they start. Do not pad it with the obvious, and do not front-load setup that only a subset hits. If a problem bites only some readers, put it in troubleshooting keyed to the symptom they will actually see, so the rest never read it.
/var/run/docker.sock ownership and usermod -aG docker
before the reader can run anything. Most readers already have daemon access.permission denied ... /var/run/docker.sock — your user cannot reach
the Docker daemon. Run as root, use sudo, or sudo usermod -aG docker $USER then open a new
shell. (docker-group membership is root-equivalent on the host.)"Before inventing a layout, look at how the rest of the docs do it. Use the existing Docusaurus components: :::info, :::warning, :::tip, collapsibles. Do not invent a new troubleshooting format per page. Consistency is what lets a reader skim.
Use an admonition for a genuine warning or aside. Do not smuggle a caveat into body prose.
A heading is a signpost. "Sandbox isolation and security", not a clause or a claim. If a reader cannot tell what is under a heading from the heading alone, rename it.
An overview answers "where do I start and what applies to me". It is a short, high-level map with links, not a prose introduction to the product and not a restatement of the sidebar. Assume the reader already knows what Agenta is.
Env examples get commented for a human skimming them, not for exhaustive machine documentation.
AGENTA_RUNNER_CONCURRENCY_LIMIT does not need "maximum concurrent runs".Before writing, decide which of the four types you are writing. Don't mix them in one page.
| Type | Purpose | Reader is… | Example |
|---|---|---|---|
| Tutorial | Teach a skill through a guided run | Learning | "Build your first Agenta application" |
| How-to | Accomplish a specific task | Working, already competent | "How to deploy a variant to production" |
| Reference | Look up facts during work | Working | API endpoint pages, config option lists |
| Explanation | Understand the why | Studying | "How versioning works in Agenta" |
Quick test: Is the reader learning or working? Do they need procedures, facts, or context? If you can't answer, pick the type before drafting.
Don't pollute a page with another type. Link out instead. A how-to that explains background mid-flow breaks the reader's task.
Tone: Docker / Stripe reference tone. Declarative. Helpful, not promotional.
Voice:
Words to avoid: "comprehensive", "powerful", "seamlessly", "easily", "simply", "robust", "leverage". Marketing words.
Punctuation:
Length:
Docs use the words customers see in the UI and API. Internal vocabulary stays in source code.
| Don't write | Write |
|---|---|
| runnable | application / workflow / evaluator (whichever applies) |
| loadable | testset revision |
| artifact / variant / revision (without context) | Use the words, but link the first occurrence to the versioning concept page |
If a page introduces a term, link to its concept page on first use.
019d952f-0000-0000-0000-000000000000."country": "France".eu.cloud.agenta.ai with the saved key) before publishing. Shapes must match what the endpoint actually returns.When writing a how-to:
Field(description=...). Never put prose in openapi_extra={}.docs/docs/reference/api/The *.api.mdx files under docs/docs/reference/api/ are auto-generated by docusaurus-plugin-openapi-docs from docs/docs/reference/openapi.json. Do not commit changes to those files from a domain PR. They produce 100+ files of noise per regen, and the regen is mechanical.
The auto-generated MDX is regenerated separately, downstream, after the underlying spec is updated. Two important facts about that flow:
pnpm update-api-docs (the default) downloads openapi.json from production (raw.githubusercontent.com/.../main). That spec does not yet contain your branch's new docstrings, so regenerating from it strips your work back out.openapi.json has to be dumped from the branch's code (e.g. by running the API locally and hitting /openapi.json, then pnpm update-api-docs:local). That step happens once at the merge stage, not in each domain PR.In a domain PR, your job is the source-of-truth changes:
Field(description=...) on request/response models.docs/docs/reference/api-guide/.Leave the auto-MDX regen to the downstream flow. If your git status shows changes under docs/docs/reference/api/, revert them before committing: git checkout origin/<base-branch> -- docs/docs/reference/api/.
npm run build in docs/) and fix any errors.ruff format then ruff check --fix in api/..claude/skills/create-changelog-announcement/SKILL.md for the dual-entry format and build rules.docs(docs): … for guide-only, docs(api): … for endpoint docstrings, mixed if both. If you have an issue id, prefix: [issue-id] docs(...): ….Start minimal. Ship a draft, get feedback, refine. Don't try to write the perfect page in one pass. Don't restructure whole sections in one PR.
Use this as the starting point when delegating doc-writing to a subagent. Fill in the bracketed parts. Always include the "Read first" list so the subagent picks up context.
You are writing [domain] documentation for Agenta.
Read first, in order:
1. .claude/skills/write-docs/SKILL.md (this file — the style rules you must follow)
2. tmp-docs-analysis/plan.md (project plan: scope, ordering, PR shape)
3. tmp-docs-analysis/concept-map/<domain>.md (domain research; if it exists)
4. The landed concept pages this work links to (e.g., 04-versioning.mdx)
5. The repo AGENTS.md sections on PR titles and lint commands
What to produce:
- [Concept page path, e.g., docs/docs/reference/api/06-workflows.mdx]
- Docstrings + Field(description=...) for [domain] endpoints in api/oss/src/apis/fastapi/<domain>/
Doc type:
- Concept page is an Explanation in Diátaxis terms.
- Endpoint docstrings are Reference. Keep them dry. No narrative inside docstrings.
Verification:
- Hit each endpoint at least once against eu.cloud.agenta.ai using the saved API key.
- Obfuscate IDs and payloads in examples, but request/response shapes must match the live API.
- If you find a bug, flag it with a repro. Do not paper over it.
Vocabulary:
- Customer-facing only. No "runnable" or "loadable". See §3 of write-docs.
Ship:
- Draft PR via `gh pr create --draft`.
- PR title: `docs(api): <domain> endpoint docstrings + concept page`.
- Run `ruff format` and `ruff check --fix` in api/ before commit.
- Run the docs build in docs/ before commit.
Out of scope:
- [List anything explicitly excluded, e.g., admin endpoints, preview endpoints]93872a6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.