Install
$ agentstack add skill-zio-zio-skills-docs-writing-style ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
ZIO Documentation Writing Style
Agent Workflow
Phase 1 — Planning only, no edits yet Scan the document and identify every prose style violation (Rules 1–25 below). For each violation, create one task:
> "Fix style – `: (Rule ): `"
Do not touch any source file until the full task list is created and you have listed it for confirmation.
Phase 2 — Execution Apply all fixes. Mark each task completed as you finish it.
Phase 3 — Mechanical validation After all tasks are completed, run:
bash ${CLAUDE_PLUGIN_ROOT}/skills/docs-writing-style/check-docs-style.sh
Verify exit code is 0. If not, re-open the relevant tasks and fix.
Mechanical Validation
Before validating manually, run the mechanical style checks to catch common violations of the most critical rules:
bash ${CLAUDE_PLUGIN_ROOT}/skills/docs-writing-style/check-docs-style.sh
This checks Rules 2, 3, 4, 7, 8, 10, 11, 12, 13, 15, 16, 18, 22, 23, and 25 for mechanical violations. Run with --help for the full rule list and usage examples.
Exit codes:
| Code | Meaning | | ---- | ----------------------------------------------------------- | | 0 | No violations — all checked rules pass. | | 1 | One or more violations found. Details printed to stdout. | | 2 | Invocation error (missing/extra arguments, file not found). |
Rule 8 detects unqualified methods using heuristics (camelCase in backticks, confident if qualified elsewhere). Update SAFE_NAMES in check-docs-style.sh to avoid false positives.
Prose Style Rules
- Person pronouns: Use "we" when guiding the reader or walking through examples ("we can create...", "we need to..."). Use "you" when addressing the reader's choices ("if you need...", "you might want to...").
- Tense: Present tense only ("returns", "creates", "modifies").
- No padding/filler: No filler phrases like "as we can see" or "it's worth noting that". Just state the fact.
- Bullet capitalization: When a bullet point is a full sentence, start it with a capital letter.
- No manual line breaks in prose: Do not hard-wrap paragraph text at a fixed column. Write each paragraph as one continuous line.
- ASCII art usage: Use it for diagrams showing data flow, type relationships, or architecture. Readers find these very helpful for understanding how pieces fit together.
- Link to related docs: Use relative paths with the full filename including
.md
extension. Never use a bare directory name: ✅ [Endpoint](./reference/endpoint/index.md), ❌ [Endpoint](./reference/endpoint).
Referencing Types, Operations, and Constructors
- Always qualify method/constructor names:
Bad vs. Good:
- ❌ "Call
mapto transform elements" → ✅ "CallChunk#mapto transform elements" - ❌ "Use
applyto construct a binding" → ✅ "UseBindingResolver.applyto construct a binding" - ❌ "Use
.queryto add a parameter" → ✅ "UseEndpoint#queryto add a parameter"
Dot-prefixed references (` .method or .method(args) `) are always a violation — they imply a receiver without naming it.
- Type name alone rule: When referring to a type (not a method), use only its name in backticks with no qualifier: "
Asderives automatically", "Listis a sequence type", "convert toOption".
Frontmatter Titles
- No duplicate markdown heading: Do not create a markdown heading (
#) that duplicates the frontmatter title. The frontmatter title is sufficient:
Bad vs. Good:
- ❌ Frontmatter has
title: "As Type", then document starts with# As Type - ✅ Start directly with
## Overviewor## Use Cases
Heading and Code Block Layout Rules
- Heading hierarchy: Use
##for major sections,###for subsections, and####for subsubsections. All three levels are fully supported and encouraged. - No bare subheaders: Always write an intro sentence between a
##header and its first###subheader. Explain why this section exists and what problem it solves. This can be a single sentence or a short paragraph.
Bad vs. Good:
- ❌
## Operations→### Map(no intro between them)
✅ ## Operations → To transform values, use these operations. → ### Map
- No lone subheaders: Never create a subsection with only one child.
Bad vs. Good:
- ❌
## Overview→### Definition(only one subsection)
✅ ## Overview (put the definition content directly here)
- When to use
####: Use####to organize multiple related topics under a single###. Example:
`` ### Operations #### Transformations #### Filtering #### Zipping #### Scanning ``
- Every code block must be preceded by a prose sentence ending with
:: Never follow a heading directly with a code block. Always write an intro sentence that ends with:.
Bad vs. Good:
- ❌
#### Chunk#map→ (code block immediately)
✅ #### Chunk#map → To transform each element: → (code block)
Between consecutive code blocks, add bridging prose that explains what the next block demonstrates: - ❌ (code block) (code block) (no prose between) ✅ (code block) Next, create the result: (code block)
Code Block Rules
- Always include imports: Every code block must start with the necessary import statements.
- One concept per code block: Each code block demonstrates one cohesive idea.
- Prefer
valovervar: Use immutable patterns everywhere if possible. - Show method signatures within their containing type: Document methods within their containing trait/class, not as bare signatures. Provides context about ownership and API surface.
Bad vs. Good:
- ❌
def map[B](f: A => B): ZIO[R, E, B] = ??? - ✅
trait ZIO[-R, +E, +A] { def map[B](f: A => B): ZIO[R, E, B] = ??? }
- Write contextualized descriptions for code blocks: When showing example code snippets, explain what they do and why they are relevant. Provide context before every code block with a sentence that introduces it, explains its purpose, and ends with a colon (
:). The introduction must be contextualized — relate it to what the code demonstrates or why it matters in context (avoid generic phrases like "here's an example" or "we can see this in action").
Bad vs. Good:
- ❌ "Here's an example:"
✅ "To extract the first three elements from the end of the chunk:"
- ❌ "We can see this in action:"
✅ "When filtering an empty chunk, the result contains no elements:"
Table Formatting
- Pad column alignment: Align table columns with spaces for readability.
Bad (minimal spacing):
| Name | Value |
| - | - |
Good (padded for alignment):
| Name | Value |
| ----- | --------- |
Scala Version
- Default to Scala 2.13.x syntax: Use Scala 2.13 syntax only. Always use
import x._for wildcard imports, neverimport x.*. - Use tabs for version-specific syntax: Use tabbed code blocks to show syntax differences between Scala 2 and 3 (e.g.,
usingvsimplicit, wildcard imports). Scala 2 is always the default tab.
Dependency Declarations
- Use @VERSION@ placeholder for versions:
Bad vs. Good:
- ❌
libraryDependencies += "dev.zio" %% "zio-blocks" % "1.0.0" - ❌
libraryDependencies += "dev.zio" %% "zio-blocks" % "" - ✅
libraryDependencies += "dev.zio" %% "zio-blocks" % "@VERSION@"
ZIO-Specific Conventions
- Never include
implicit trace: Tracein documented method signatures. It is a compiler implementation detail, not part of the public API. Developers don't provide it explicitly—ZIO's macros inject it automatically.
Bad vs. Good:
- ❌
def take(implicit trace: Trace): UIO[A] - ✅
def take(): UIO[A]
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: zio
- Source: zio/zio-skills
- License: Apache-2.0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.