Skill Authoring
Grafana LabsOfficialPublished by Grafana Labs
- Skill
- Meta (authoring, orchestration, planning, memory)
- Agent tooling
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to creating and maintaining agent skills within the Grafana ecosystem. It defines a canonical structure for SKILL.md files, including YAML frontmatter, progressive disclosure patterns, and a validation feedback loop. It is designed to help developers align their skills with specific rubrics covering conciseness, actionability, workflow clarity, and progressive disclosure, ensuring they pass automated CI gates and trigger effectively for users.
What it does
- Provides a rubric for auditing and scoring skill documentation.
- Defines the canonical SKILL.md structure and bundle layout.
- Implements a validate-fix-rerun feedback loop for skill optimization.
- Offers guidance on progressive disclosure and splitting strategies for large documentation.
- Details trigger patterns to ensure skills are correctly identified by agents.
- Lists common anti-patterns to avoid during skill development.
When to use it
- When creating a new skill within the repository.
- When reviewing a skill pull request.
- When a skill fails the CI merge gate or receives a low review score.
- When a skill is not triggering as expected during agent interactions.
- When restructuring long documentation into a bundle.
- When seeking advice on optimizing or fixing existing skill files.
Advantages
- Standardizes skill development across the repository.
- Provides actionable feedback based on automated review scores.
- Reduces token usage through progressive disclosure strategies.
- Ensures consistent trigger behavior via pushy description patterns.
- Facilitates easier maintenance through modular bundle layouts.
Usage examples
- “How do I improve my skill's review score?”
- The agent will guide you through the Tessl review process, identifying specific dimensions like conciseness or actionability that need improvement based on the rubric.
- “My skill isn't triggering when I ask for help. What should I do?”
- The agent will audit your skill's description against the pushy-description pattern and suggest updates to ensure it includes the necessary trigger terms.
- “How should I split a long SKILL.md file?”
- The agent will provide strategies for splitting content into references/ files based on domain, depth, or format to maintain the three-level loading model.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/grafana/skill-authoring/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip skill-authoring.zip -d .agents/skills
Documentation by Grafana Labs
Authoring & Improving Grafana Skills
How to write, review, and improve SKILL.md files so they pass the repo's CI gate and score well against the Anthropic-aligned rubric Tessl uses.
Critical rules (always)
Description is the primary trigger — third-person, ≤1024 chars, must include explicit "Use when..." phrasing AND list concrete trigger terms users naturally say. See references/descriptions.md for the pushy-description pattern that combats undertriggering.
Body under 500 lines — split into
references/*.mdif approaching the limit. SKILL.md is the routing layer, not the entire knowledge base.One level of nesting for references — link from SKILL.md directly, never
SKILL.md → a.md → b.md. Claude may usehead -100previews on nested chains and miss content.Imperative voice — "Run X" not "You should run X" not "It is important to run X". Explain why over heavy-handed
MUSTmarkers.Concrete examples beat prose — copy-paste-ready commands, real config snippets. Tessl's
actionabilitydimension scores this directly.No reserved words in
name—anthropicandclaudeare forbidden in skill names.No time-sensitive language in the body — "after August 2025…" rots. Use an
<details>"Old patterns" section for legacy info instead.Validate before committing —
./scripts/lint-skills.sh skills/<plugin>/<your-skill>clean + Tessl score ≥75 (runtessl skill review --json <dir>).
The rubric
CI fails any PR where a touched SKILL.md scores below 75 on four 0-3 dimensions: conciseness, actionability, workflow clarity, progressive disclosure. Full per-dimension scoring + Anthropic-doc mapping in references/rubric.md.
Score variance
The judge is an LLM and swings 7-10 points run-to-run. Local 94 commonly lands at CI 85. Ship only on three consecutive local 100s.
Decision tree for a new skill
What product / domain does this skill belong to? Pick the right plugin folder:
grafana-core/,grafana-cloud/,grafana-lgtm/,grafana-app-sdk/,grafana-k6/,grafana-plugins/. If none fits cleanly, ask the user before creating a new plugin group (a new group requires updating threemarketplace.jsonfiles).Estimate body length.
<200 lines of substance → single
SKILL.md, no bundle200-500 lines →
SKILL.md+references/<topic>.mdfor the long-form material500 lines → mandatory bundle split; see references/anatomy.md § Splitting strategies
Write a "pushy" description first. The description is the only thing always loaded into context. If agents don't trigger the skill, nothing else matters. See references/descriptions.md for the pattern.
Draft body with the four-dimension rubric in mind.
Cut every sentence Claude already knows (Conciseness)
Replace prose explanations with code blocks (Actionability)
Number every multi-step procedure + add a validation step at the end (Workflow clarity)
If you reach for
<details>, consider whether that content belongs inreferences/instead (Progressive disclosure)
Register in marketplace manifests. Add the skill path to the
skillsarray in all three:.claude-plugin/marketplace.json.cursor-plugin/marketplace.json.agents-plugin/marketplace.json
Validate locally.
# 1. Lint clean (0 errors) ./scripts/lint-skills.sh skills/<plugin>/<your-skill> # 2. Tessl reviewScore ≥75 (the CI gate) tessl skill review --json skills/<plugin>/<your-skill> | jq '.review.reviewScore' # 3. If below 75 or you want ≥85: run --optimize (requires auth) tessl skill review --optimize --yes --max-iterations 3 skills/<plugin>/<your-skill>If the run fails: read the lint error / Tessl suggestion, fix, re-run. Don't open the PR until both checks pass cleanly. The feedback-loop pattern beats one-shot writing.
Fixing a low-scoring existing skill
Read the judge's verbatim Suggestions text (non-JSON output):
tessl skill review skills/<plugin>/<name>The
Suggestions:block under each dimension names the exact sentences/sections to cut. Copy the suggestion — don't guess. Then verify the lowest dimension matches your read.Apply the fix pattern from references/rubric.md:
Conciseness 1-2 → cut intros, definitions, multi-line tables that mostly point to refs
Actionability 1-2 → replace prose with code blocks and CLI commands
Workflow clarity 1-2 → add numbered steps + validation checkpoints
Progressive disclosure 1-2 → split into
references/*.md
If the skill is intentionally a routing document (like
grafana-k6/k6-docs), don't let--optimizeinline the bundle back into SKILL.md. Hand-craft a minimal copy-paste "validation loop" inline so SKILL.md is independently actionable, while preserving the bundle.Re-score five times locally. Don't stop until all five runs hit 100 — see "Score variance" above for why.
Anti-patterns
See references/anti-patterns.md.
References
references/descriptions.md— the pushy-description pattern + trigger-term checklistreferences/rubric.md— per-dimension scoring with Anthropic-doc citations and concrete fix patternsreferences/anatomy.md— three-level progressive disclosure, bundle layout, splitting strategiesreferences/anti-patterns.md— what NOT to do, with examples
Files
- ATTRIBUTION.mdAdded by AutoGineer850 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md7.0 KiB
- references/anatomy.md5.5 KiB
- references/anti-patterns.md7.4 KiB
- references/descriptions.md4.4 KiB
- references/rubric.md12.2 KiB
references/anatomy.md
Anatomy of a skill bundle
The canonical layout
skills/<plugin>/<skill-name>/
├── SKILL.md (required: YAML frontmatter + body)
├── references/ (markdown loaded only when needed)
│ ├── topic-a.md
│ └── topic-b.md
├── scripts/ (executable code; not loaded into context)
│ └── helper.py
└── assets/ (templates, fonts, images used as output)
└── template.jsonSource: anthropics/skills — skill-creator SKILL.md § Anatomy of a Skill.
The three-level loading model
| Level | What's loaded | When | Token cost |
|---|---|---|---|
| 1. Metadata | name + description | Always (at agent startup) | ~50-200 tokens per skill |
| 2. SKILL.md body | Full markdown body | When the agent decides the skill triggers | ~500-3000 tokens once loaded |
| 3. Bundle | references/*.md, assets/*, scripts/* (via bash, not context) | On demand, only the specific file the body links to | Zero until accessed |
Implication: the cheapest way to lift Conciseness is to move heavy content from level 2 to level 3.
SKILL.md size guidance
Aim: ≤200 lines for the body
Hard guideline: ≤500 lines (Anthropic's documented limit)
Soft threshold: If you're past 250 lines, ask whether some sections should be
references/*.md
Splitting strategies
By domain (when a skill spans multiple platforms/frameworks)
cloud-integrations/
├── SKILL.md (overview + selection logic: "if AWS, see references/aws.md…")
└── references/
├── aws.md
├── gcp.md
├── azure.md
└── confluent.mdClaude reads SKILL.md, sees the user mentioned AWS, reads only references/aws.md. The other three never load → zero token cost.
By depth (when overview vs. detail is clear)
react-19-plugin-migration/
├── SKILL.md (decision tree + critical rules + happy path)
└── references/
├── eslint-9-migration.md (deep dive for the ESLint sub-step)
└── troubleshooting.md (failure modes + fixes)By format (when reference material doesn't fit the prose flow)
admin/
├── SKILL.md
└── references/
├── sso.md (full OAuth/SAML/GitHub OAuth configs)
├── terraform.md (Terraform provider examples)
└── api-reference.md (Cloud API + Admin endpoints + audit logs)Reference-file conventions
Filename: short, descriptive, lowercase-with-hyphens (
troubleshooting.md, notTroubleshooting.mdorDocs.md)Top of file: if >100 lines, include a
## Contentstable of contents so Claude can navigate during a partial readLinked one level deep from SKILL.md — never a chain (
SKILL.md → a.md → b.md)Inline relative links —
[full setup guide](references/sso.md)from SKILL.md, not absolute URLs
When NOT to inline
Tessl's rubric penalizes routing documents (a thin SKILL.md that defers to references/) by scoring them down for "not independently actionable". The naive response is to inline content from references back into SKILL.md, which undoes the deliberate progressive disclosure.
Better fix for routing skills: add a minimal copy-paste-ready "happy path" loop inline so SKILL.md is independently actionable for the most common task, while preserving the bundle for everything else.
Concrete example — grafana-k6/k6-docs (33 lines in its SKILL.md):
## Workflow
Pick the workflow that matches the user's intent:
- **Write documentation:** follow [references/workflows/write.md](references/workflows/write.md)
- **Review documentation:** follow [references/workflows/review.md](references/workflows/review.md)
## Validating examples (always run before committing)
Every code example in k6 documentation and release notes must execute cleanly against `k6@master`:
```bash
cd ~/path/to/k6
git checkout master
git pull
go run . run /path/to/script.js
```
If the run fails: read the error, fix the source, re-run. Don't commit a doc edit whose
example doesn't run clean. For the full multi-example workflow with parallel subagents,
see [references/testing-workflow.md](references/testing-workflow.md).This pattern (the file lifted its score from 72 → 100):
Keeps the routing layer + bundle architecture
Adds enough inline content that Claude can do the common task without loading any bundle file
Still defers full procedural detail to the references/
scripts/ directory
Use when the skill includes deterministic operations Claude shouldn't reinvent:
File transformations (PDF extraction, image resizing)
Validation harnesses
Output formatters
Scripts are executed via bash; their contents do not consume context tokens, only their output does. Big performance win for skills that run the same code repeatedly.
Make scripts executable (chmod +x) — the linter warns otherwise.
assets/ directory
Use for template files, fonts, images, or other static resources the skill produces as output. Like scripts, assets don't consume tokens until referenced.
Marketplace registration
After creating the skill directory, add it to the skills array in all three marketplace files:
.claude-plugin/marketplace.json.cursor-plugin/marketplace.json.agents-plugin/marketplace.json
The three must stay in sync. CI's validate job will fail any PR where they diverge.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Grafana Labs
- Publisher
- Grafana Labs (Official)
- Source
- grafana/skills · skills/grafana-core/skill-authoring · commit 8fb72a5
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Grafana Labs or Grafana Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download skill-authoring.zip