/skill-authoring
Author, audit, and improve Grafana SKILL.md files against Anthropic's published Agent Skills guidance and the four-dimension rubric the grafana/skills CI gate uses (conciseness, actionability, workflow clarity, progressive disclosure). Applies the canonical SKILL.md structure
$ npx -y skills add grafana/skills --skill skill-authoring --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/skill-authoring
Context preview
The summary Claude sees to decide when to auto-load this skill.
Author, audit, and improve Grafana SKILL.md files against Anthropic's published Agent Skills guidance and the four-dimension rubric the grafana/skills CI gate uses (conciseness, actionability, workflow clarity, progressive disclosure). Applies the canonical SKILL.md structure
SKILL.md
skill-authoring.SKILL.mdname: skill-authoring
license: Apache-2.0
description: Author, audit, and improve Grafana SKILL.md files against Anthropic's published Agent Skills guidance and the four-dimension rubric the grafana/skills CI gate uses (conciseness, actionability, workflow clarity, progressive disclosure). Applies the canonical SKILL.md structure (YAML frontmatter + body + references/ + scripts/ + assets/), the "pushy description" trigger pattern, the three-level progressive-disclosure model, and the validate-fix-rerun feedback loop. Use when creating a new skill in this repo, when reviewing a skill PR, when a skill's Tessl review score is below 75 (the merge gate), when a skill's description isn't getting picked up by agents, when restructuring a long SKILL.md into a bundle, or when the user asks how to write, improve, optimize, audit, or fix a skill - even if they don't say "skill" explicitly (e.g. "this isn't triggering", "Tessl scored this 72", "split this doc").
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)
1. **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](references/descriptions.md) for the pushy-description pattern that combats undertriggering. 2. **Body under 500 lines** — split into `references/*.md` if approaching the limit. SKILL.md is the routing layer, not the entire knowledge base. 3. **One level of nesting for references** — link from SKILL.md directly, never `SKILL.md → a.md → b.md`. Claude may use `head -100` previews on nested chains and miss content. 4. **Imperative voice** — "Run X" not "You should run X" not "It is important to run X". Explain *why* over heavy-handed `MUST` markers. 5. **Concrete examples beat prose** — copy-paste-ready commands, real config snippets. Tessl's `actionability` dimension scores this directly. 6. **No reserved words in `name`** — `anthropic` and `claude` are forbidden in skill names. 7. **No time-sensitive language in the body** — "after August 2025…" rots. Use an `<details>` "Old patterns" section for legacy info instead. 8. **Validate before committing** — `./scripts/lint-skills.sh skills/<plugin>/<your-skill>` clean + Tessl score ≥75 (run `tessl 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](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
1. **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 three `marketplace.json` files).
2. **Estimate body length.**
- <200 lines of substance → single `SKILL.md`, no bundle
- 200-500 lines → `SKILL.md` + `references/<topic>.md` for the long-form material
- >500 lines → mandatory bundle split; see [references/anatomy.md § Splitting strategies](references/anatomy.md#splitting-strategies)
3. **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](references/descriptions.md) for the pattern.
4. **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 in `references/` instead (Progressive disclosure)
5. **Register in marketplace manifests.** Add the skill path to the `skills` array in all three:
- `.claude-plugin/marketplace.json`
- `.cursor-plugin/marketplace.json`
- `.agents-plugin/marketplace.json`
6. **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
1. 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.
2. Apply the fix pattern from [references/rubric.md](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`
3. If the skill is **intentionally a routing document** (like `grafana-k6/k6-docs`), don't let `--optimize` inline the bundle back into SKILL.md. Hand-craft a minimal copy-paste "validation loop" inline so
Read more
name: skill-authoring license: Apache-2.0 description: Author, audit, and improve Grafana SKILL.md files against Anthropic's published Agent Skills guidance and the four-dimension rubric the grafana/skills CI gate uses (conciseness, actionability, workflow clarity, progressive disclosure). Applies the canonical SKILL.md structure (YAML frontmatter + body + references/ + scripts/ + assets/), the "pushy description" trigger pattern, the three-level progressive-disclosure model, and the validate-fix-rerun feedback loop. Use when creating a new skill in this repo, when reviewing a skill PR, when a skill's Tessl review score is below 75 (the merge gate), when a skill's description isn't getting picked up by agents, when restructuring a long SKILL.md into a bundle, or when the user asks how to write, improve, optimize, audit, or fix a skill - even if they don't say "skill" explicitly (e.g. "this isn't triggering", "Tessl scored this 72", "split this doc").
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)
1. **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](references/descriptions.md) for the pushy-description pattern that combats undertriggering. 2. **Body under 500 lines** — split into `references/*.md` if approaching the limit. SKILL.md is the routing layer, not the entire knowledge base. 3. **One level of nesting for references** — link from SKILL.md directly, never `SKILL.md → a.md → b.md`. Claude may use `head -100` previews on nested chains and miss content. 4. **Imperative voice** — "Run X" not "You should run X" not "It is important to run X". Explain *why* over heavy-handed `MUST` markers. 5. **Concrete examples beat prose** — copy-paste-ready commands, real config snippets. Tessl's `actionability` dimension scores this directly. 6. **No reserved words in `name`** — `anthropic` and `claude` are forbidden in skill names. 7. **No time-sensitive language in the body** — "after August 2025…" rots. Use an `<details>` "Old patterns" section for legacy info instead. 8. **Validate before committing** — `./scripts/lint-skills.sh skills/<plugin>/<your-skill>` clean + Tessl score ≥75 (run `tessl 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](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
1. **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 three `marketplace.json` files).
2. **Estimate body length.**
- <200 lines of substance → single `SKILL.md`, no bundle
- 200-500 lines → `SKILL.md` + `references/<topic>.md` for the long-form material
- >500 lines → mandatory bundle split; see [references/anatomy.md § Splitting strategies](references/anatomy.md#splitting-strategies)
3. **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](references/descriptions.md) for the pattern.
4. **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 in `references/` instead (Progressive disclosure)
5. **Register in marketplace manifests.** Add the skill path to the `skills` array in all three:
- `.claude-plugin/marketplace.json`
- `.cursor-plugin/marketplace.json`
- `.agents-plugin/marketplace.json`
6. **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
1. 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.
2. Apply the fix pattern from [references/rubric.md](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`
3. If the skill is **intentionally a routing document** (like `grafana-k6/k6-docs`), don't let `--optimize` inline the bundle back into SKILL.md. Hand-craft a minimal copy-paste "validation loop" inline so
Public skills for working with Grafana, Prometheus, Loki, Tempo, Pyroscope, k6, and the broader LGTM observability stack. Compatible with Claude Code, Cursor, Codex, and any tool supporting the Agent Skills open standard.
Repo: grafana/skills
Other skills on grafana-skills.
- /admission-control
Use when the user asks to "write a validator", "add validation", "implement admission control", "write a mutating webhook", "add a mutation handler", "validate incoming resources", "implement admission logic", "add admission webhooks", "write ingress validation", or asks how to
Open skill - /app-sdk-concepts
Use when starting any grafana-app-sdk work — scaffolding a Grafana app, initializing a Grafana App Platform app, picking a deployment mode (standalone operator / grafana/apps / frontend-only), wiring app-specific config, or onboarding to the SDK. Covers `grafana-app-sdk` CLI
Open skill - /cue-kind-definition
Author CUE kind definitions for grafana-app-sdk apps - schemas, versioning, field constraints, named type definitions, custom routes, and codegen configuration. Scaffolds kinds via `grafana-app-sdk project kind add`, writes spec/status schemas with type constraints (regex, enum,
Open skill - /reconciler-logic
Implement reconcilers and watchers for grafana-app-sdk apps — write `TypedReconciler[*MyKind]` reconcile functions, apply generation-based skip patterns, do conflict-safe status updates via `resource.UpdateObject`, configure `BasicReconcileOptions` (namespace, label/field
Open skill - /adaptive-metrics
Cut Grafana Cloud Metrics cost by shrinking active-series count with Adaptive Metrics aggregation rules — auto-recommendations from query history, custom exact/regex rules, label-drop config, unused-metric detection, and Alloy remote_write fallback. Use when investigating a high
Open skill - /admin
Manage Grafana Cloud accounts — organizations, stacks, RBAC roles and assignments, SSO/SAML/OAuth/GitHub auth, service accounts for CI/CD, user invites, team membership, and API-driven provisioning. Creates stacks via the Cloud API, mints service-account tokens, applies role
Open skill

