Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Write and maintain project documentation including READMEs, API docs, ADRs, CHANGELOGs, and inline code comments. Use when: the user asks to write documentation, update a README, create an API reference, draft an ADR, add a CHANGELOG entry, or improve inline comments. Do NOT use when: the user wants to format markdown (use markdown-format), review code (use pr-review), or create a PRD (use create-prd).
.claude/skills/marco-souza-docs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 233% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 354% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 444% | 0% |
Write clear, consistent, and maintainable documentation for software projects.
Every project should have a README.md at the root with these sections:
markdown# Project Name One-sentence description of what the project does. ## Features - Feature 1: brief description - Feature 2: brief description ## Quick Start ### Prerequisites - Requirement 1 - Requirement 2 ### Installation
### Usage
## Configuration
| Variable | Description | Default |
|----------|-------------|---------|
| `VAR_NAME` | What it does | `default` |
## API Reference
Link to detailed API docs or inline summary.
## Contributing
Link to CONTRIBUTING.md or brief guidelines.
## License
License type with link.Rules:
Document APIs using these patterns:
markdown## Endpoints ### POST /api/v1/users Create a new user account. **Request:**
{ "email": "user@example.com", "name": "Jane Doe", "role": "member" }
**Response (201 Created):**
{ "id": "usr_abc123", "email": "user@example.com", "name": "Jane Doe", "created_at": "2024-01-15T10:30:00Z" }
**Errors:**
| Status | Code | Description |
|--------|------|-------------|
| 400 | `invalid_email` | Email format is invalid |
| 409 | `email_exists` | Email already registered |markdown## Commands ### `tool init` Initialize a new project. **Usage:**
tool init options] <project-name>
**Options:**
| Flag | Description | Default |
|------|-------------|---------|
| `--template, -t` | Template to use | `default` |
| `--yes, -y` | Skip prompts | `false` |
**Examples:**
tool init my-project
tool init my-project --template typescript
markdown### `createUser(options: CreateUserOptions): Promise<User>` Creates a new user in the system. **Parameters:** - `options.email` (string, required): User's email address - `options.name` (string, required): User's display name - `options.role` (enum, optional): User role. One of: `admin`, `member`, `viewer`. Default: `member` **Returns:** `Promise<User>` - The created user object **Throws:** - `ValidationError` - If email is invalid - `ConflictError` - If email already exists **Example:**
const user = await createUser({ email: 'jane@example.com', name: 'Jane Doe' });
Use ADRs to document significant architectural decisions. Store in docs/adr/ or docs/decisions/.
markdown# ADR-{NUMBER}: {TITLE} ## Status {Proposed | Accepted | Deprecated | Superseded by ADR-XXX} ## Date {YYYY-MM-DD} ## Context What is the issue that we're seeing that is motivating this decision or change? ## Decision What is the change that we're proposing and/or doing? ## Consequences ### Positive - {benefit 1} - {benefit 2} ### Negative - {tradeoff 1} - {tradeoff 2} ### Risks - {risk 1} ## Alternatives Considered ### {Alternative 1} {Description of alternative} **Pros:** {benefits} **Cons:** {drawbacks} **Why rejected:** {reason}
markdown# ADR-001: Use PostgreSQL as Primary Database ## Status Accepted ## Date 2024-01-15 ## Context We need a relational database that supports complex queries, JSON storage, and has strong ecosystem support. ## Decision We will use PostgreSQL as our primary database. ## Consequences ### Positive - ACID compliance for transactional data - Native JSON support for flexible schemas - Excellent tooling and community support ### Negative - Heavier operational overhead than SQLite - Requires dedicated database server ### Risks - Team needs to learn PostgreSQL-specific features ## Alternatives Considered ### SQLite **Pros:** Zero config, embedded, fast for read-heavy workloads **Cons:** Limited concurrency, no network access **Why rejected:** Doesn't support concurrent writes from multiple services
Rules:
001, 002, etc.Follow Keep a Changelog format. File: CHANGELOG.md.
markdown# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] ### Added - New feature description ### Changed - Changes to existing functionality ### Deprecated - Features that will be removed ### Removed - Features that have been removed ### Fixed - Bug fixes ### Security - Vulnerability fixes ## [1.2.0] - 2024-01-15 ### Added - User authentication with JWT tokens - Rate limiting on API endpoints ### Fixed - Memory leak in connection pool - Incorrect date formatting in exports ## [1.1.0] - 2024-01-01 ### Added - CSV export functionality ### Changed - Improved query performance by 50% ## [1.0.0] - 2023-12-01 Initial stable release.
Rules:
[Unreleased] section- Fix login timeout (#123)go// GOOD: Explains why // Retry 3 times because the API intermittently fails under load for i := 0; i < 3; i++ { result, err := callAPI() if err == nil { return result } } // BAD: Explains what (code is self-explanatory) // Loop 3 times for i := 0; i < 3; i++ { // ... }
go// ProcessOrder handles the complete order lifecycle including payment // processing, inventory allocation, and shipping notification. // // It returns an error if any step fails, but partial side effects // may have occurred (e.g., payment charged but not shipped). // // See: https://docs.internal.com/orders/lifecycle func ProcessOrder(ctx context.Context, orderID string) error { // ... }
typescript// TODO(username): description [ticket-id] // FIXME(username): description [ticket-id] // HACK(username): temporary workaround for #123 // Examples: // TODO(jane): add retry logic for transient failures [PROJ-456] // FIXME(bob): remove after API v1 deprecation [PROJ-789]
code blocks for commands, paths, and codeoth)When documentation is outdated:
[Unreleased] > FixedWhen documentation conflicts with code:
For major documentation overhauls:
Input: User asks "Write a README for my project"
Process:
package.json, go.mod, or similar to understand the projectOutput:
markdown# myproject A fast, lightweight JSON parser for Go. ## Quick Start
go get github.com/user/myproject
import "github.com/user/myproject"
data, err := myproject.Parse(jsonString)
## Features
- Streaming parser for large files
- Zero allocations in hot path
- Full RFC 8259 complianceInput: User asks "Document why we chose Redis"
Process:
docs/adr/003-use-redis-for-caching.md| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,119 | 11,066 | -16% | 1 | 1 | 0% | 2,856 | 4,917 | +72% | 0 | 0 | — |
case-02 | fail→fail | 22,977 | 7,539 | -67% | 1 | 1 | 0% | 2,549 | 4,558 | +79% | 0 | 0 | — |
case-03 | fail→pass | 9,542 | 7,972 | -16% | 1 | 1 | 0% | 2,322 | 4,693 | +102% | 0 | 0 | — |
case-04 | pass→pass | 5,192 | 3,550 | -32% | 1 | 1 | 0% | 1,105 | 3,581 | +224% | 0 | 0 | — |
case-05 | pass→pass | 5,910 | 4,367 | -26% | 1 | 1 | 0% | 1,374 | 3,817 | +178% | 0 | 0 | — |
case-11 | pass→pass | 8,964 | 4,463 | -50% | 1 | 1 | 0% | 1,732 | 3,726 | +115% | 0 | 0 | — |
case-06 | fail→pass | 5,132 | 4,251 | -17% | 1 | 1 | 0% | 1,130 | 3,768 | +233% | 0 | 0 | — |
case-07 | fail→pass | 3,233 | 2,265 | -30% | 1 | 1 | 0% | 727 | 3,300 | +354% | 0 | 0 | — |
case-08 | fail→pass | 3,822 | 2,098 | -45% | 1 | 1 | 0% | 589 | 3,202 | +444% | 0 | 0 | — |
case-09 | fail→pass | 2,318 | 3,677 | +59% | 1 | 1 | 0% | 458 | 3,446 | +652% | 0 | 0 | — |
case-10 | fail→pass | 8,933 | 7,126 | -20% | 1 | 1 | 0% | 1,726 | 4,123 | +139% | 0 | 0 | — |
case-12 | fail→pass | 7,296 | 4,315 | -41% | 1 | 1 | 0% | 1,429 | 3,707 | +159% | 0 | 0 | — |
case-13 | pass→pass | 2,549 | 2,491 | -2% | 1 | 1 | 0% | 554 | 3,344 | +504% | 0 | 0 | — |
case-14 | pass→pass | 4,916 | 2,847 | -42% | 1 | 1 | 0% | 1,072 | 3,413 | +218% | 0 | 0 | — |
case-15 | pass→pass | 3,756 | 2,519 | -33% | 1 | 1 | 0% | 741 | 3,268 | +341% | 0 | 0 | — |
case-16 | fail→pass | 3,565 | 2,235 | -37% | 1 | 1 | 0% | 573 | 3,163 | +452% | 0 | 0 | — |
case-17 | pass→pass | 4,737 | 3,231 | -32% | 1 | 1 | 0% | 904 | 3,426 | +279% | 0 | 0 | — |
case-18 | pass→pass | 5,158 | 2,960 | -43% | 1 | 1 | 0% | 1,058 | 3,419 | +223% | 0 | 0 | — |
case-19 | pass→pass | 7,389 | 3,704 | -50% | 1 | 1 | 0% | 1,374 | 3,576 | +160% | 0 | 0 | — |
case-20 | pass→pass | 5,550 | 2,322 | -58% | 1 | 1 | 0% | 1,051 | 3,279 | +212% | 0 | 0 | — |
case-21 | pass→pass | 3,456 | 4,075 | +18% | 1 | 1 | 0% | 841 | 3,696 | +339% | 0 | 0 | — |
case-22 | pass→pass | 4,513 | 5,220 | +16% | 1 | 1 | 0% | 993 | 4,005 | +303% | 0 | 0 | — |
case-23 | fail→fail | 6,627 | 4,959 | -25% | 1 | 1 | 0% | 1,252 | 3,738 | +199% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +39 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.