Generated banner for Skill Writer
Generated logo for Skill Writer

Skill Writer

SentryOfficialPublished by Sentry

  • Skill
  • Meta (authoring, orchestration, planning, memory)
  • Agent tooling
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Create, synthesize, and iteratively improve agent skills following the Agent Skills specification. Use when asked to "create a skill", "write a skill", "synthesize sources into a skill", "improve a skill from positive/negative examples", "update a skill", or "maintain skill docs and registration". Handles source capture, precision passes, authoring, registration, and validation.
— the description by Sentry

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

Skill Writer provides a standardized, multi-step framework for the full lifecycle of agent skill development. It acts as a router and guide, ensuring that skills are built with high-value coverage, proper architectural layout, and clear maintenance contracts. By following its defined paths—ranging from synthesis and authoring to iteration and validation—users can produce robust, portable, and well-documented skills that adhere to established design principles and precision standards.

What it does

  • Guides the creation and synthesis of new agent skills from raw sources.
  • Facilitates iterative improvements based on positive and negative performance examples.
  • Enforces a structured reference architecture for skill documentation and runtime files.
  • Provides precision passes to ensure changes are necessary, concise, and impactful.
  • Supports the registration and validation of skills to ensure structural integrity.
  • Offers specialized paths for different execution shapes like routers, subagents, and scripts.

When to use it

  • When you need to create a new agent skill from scratch.
  • When updating or improving an existing skill's logic or documentation.
  • When synthesizing disparate sources into a cohesive, functional skill.
  • When you need to refine a skill's behavior based on specific success or failure examples.
  • When maintaining skill documentation and ensuring it meets registration standards.

Advantages

  • Ensures consistency across all developed agent skills.
  • Minimizes wasted runtime tokens by prioritizing high-value input coverage.
  • Provides clear, actionable paths for different levels of skill complexity.
  • Promotes modularity through a well-defined reference architecture.
  • Includes built-in precision checks to prevent unnecessary bloat or rule redundancy.

Usage examples

“Create a skill for managing cloud infrastructure deployments.”
The agent initiates the synthesis path, identifies the required execution shape, and guides you through authoring the SKILL.md and SPEC.md files.
“Improve this skill based on these failed test cases.”
The agent enters the iteration path, analyzes the provided evidence, and proposes specific updates to the skill's logic or documentation to resolve the failures.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/getsentry/skill-writer/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip skill-writer.zip -d .agents/skills

Documentation by Sentry

Skill Writer

Use this as the single canonical workflow for skill creation and improvement. Primary success condition: maximize high-value input coverage before authoring while minimizing wasted runtime tokens.

Follow the workflow steps in order. Load only the reference files required for the step you are on. SKILL.md is the primary router: every bundled reference file should be flat under references/ and listed here with a direct "open when..." reason.

Core Workflow References

Open when you need to...Read
choose the minimum workflow path for create, update, iterate, or research-first workreferences/mode-selection.md
choose the simplest adequate execution shape before deciding filesreferences/execution-shapes.md
apply writing constraints for depth, concision, and portabilityreferences/design-principles.md
decide what belongs in SKILL.md, references/, SPEC.md, or supporting filesreferences/reference-architecture.md
create or update the maintenance contract for a skillreferences/spec-template.md
find missing high-signal sources, including history and regressionsreferences/source-discovery.md
adapt an upstream prompt, workflow, rubric, benchmark, or docs into a skillreferences/source-adaptation.md
run the full synthesis pass with coverage checks and source capturereferences/synthesis-path.md
author or update SKILL.md, SPEC.md, and supporting filesreferences/authoring-path.md
improve trigger language and false-positive/false-negative behaviorreferences/description-optimization.md
iterate from positive, negative, or fix examplesreferences/iteration-path.md
store persistent working and holdout examples for future revisionsreferences/iteration-evidence.md
choose a response template, schema, or output contractreferences/output-contracts.md
add or update evals for a skill's generated outputs or runtime behaviorreferences/skill-evals.md
troubleshoot overloaded layouts, hidden refs, or other structure failuresreferences/structure-troubleshooting.md
register the skill and run final validation checksreferences/registration-validation.md

Artifact Layout References

Open when you need to...Read
keep the whole skill inline in one coherent SKILL.mdreferences/layout-inline-skill.md
split optional deep knowledge into focused routed referencesreferences/layout-reference-backed-skill.md
add scripts for deterministic automation or validationreferences/layout-script-backed-workflow.md
define a skill that is usually invoked with explicit argumentsreferences/layout-argument-driven-skill.md
ship reusable templates, schemas, or other static assetsreferences/layout-asset-template-skill.md

Workflow Mechanic References

Open when you need to...Read
break a task into fixed ordered stepsreferences/workflow-prompt-chaining.md
classify requests and route them to different downstream pathsreferences/workflow-routing.md
split independent work into parallel units or votesreferences/workflow-parallel.md
discover work units dynamically and coordinate worker outputsreferences/workflow-orchestrator-workers.md
run validate-fix-repeat checks during authoring or executionreferences/workflow-validation-loops.md
validate a plan before executing a risky actionreferences/workflow-plan-validate-execute.md

Claude Code References

Open when you need to...Read
use Claude-specific frontmatter or invocation controlsreferences/claude-frontmatter-invocation.md
use Claude argument fields or substitution variablesreferences/claude-argument-substitutions.md
build a skill that runs in isolated context: forkreferences/claude-subagent-fork.md
build a skill that uses Claude hooks for deterministic enforcementreferences/claude-hook-backed.md
use Claude shell preprocessing for dynamic context injectionreferences/claude-dynamic-context.md

Example Profiles

Open when you need to...Read
see the expected depth for a documentation-heavy skillreferences/example-documentation-skill.md
see the expected depth for a workflow-process skillreferences/example-workflow-process-skill.md
see what a good routed skill looks likereferences/example-router-skill.md
see what a good subagent-fork skill looks likereferences/example-subagent-fork-skill.md
see what a good hook-backed skill looks likereferences/example-hook-backed-skill.md

Step 1: Resolve target, path, and shape

  1. Resolve the intended operation (create, update, synthesize, iterate) and inspect workspace prior art before choosing where files belong.

  2. Choose the target skill root from observed conventions. If the canonical location is still unclear after inspection, ask one direct question before editing files.

  3. Read references/mode-selection.md to choose the minimum required workflow paths.

  4. Read references/execution-shapes.md to choose the primary execution shape.

  5. Default to the simplest adequate shape. If selecting a more complex shape, record why simpler shapes were rejected.

  6. Load only the exact artifact-layout, workflow-mechanic, and provider-specific leaf files required by that shape.

  7. Before adding guidance, identify what existing rule, section, or file should be narrowed, replaced, or removed.

  8. Record portability implications before using provider-specific mechanics.

Step 2: Run synthesis when needed

Read references/synthesis-path.md.

  1. Use this path for new skills, material changes, and research-first planning.

  2. Collect and score relevant sources with provenance.

  3. Read references/source-discovery.md when source material is thin, stale, or ambiguous.

  4. Read references/source-adaptation.md when adapting an upstream prompt, workflow, rubric, benchmark, or docs.

  5. Produce source-backed decisions and coverage/gap status, including the class and execution-shape choice.

  6. Load example profiles only when they add concrete depth for the selected class or shape.

  7. If the skill uses provider-specific mechanics, include current official provider docs and capture usage constraints.

  8. Do not move to authoring until required coverage is understood or gaps are explicit.

Step 3: Run iteration first when improving from outcomes/examples

Read references/iteration-path.md first when selected path includes iteration (for example operation iterate).

  1. Capture and anonymize examples with provenance.

  2. Read references/iteration-evidence.md when examples should persist beyond the current turn.

  3. Review skill behavior against working and holdout slices.

  4. Propose improvements from positive/negative/fix evidence.

  5. Carry concrete behavior deltas into authoring.

Skip this step when selected path does not include iteration.

Step 4: Author or update skill artifacts

Read references/authoring-path.md.

  1. Write or update SKILL.md in imperative voice with trigger-rich description.

  2. Keep SKILL.md as the runtime router, not an encyclopedia.

  3. Run the pre-edit precision check in references/authoring-path.md before creating new sections or files.

  4. Read references/reference-architecture.md before adding bulk instructions or new reference files.

  5. Create or update SPEC.md using references/spec-template.md when creating a new skill or materially changing its contract.

  6. Create focused reference files, scripts, and assets only when each one has a clear "open when..." reason and cannot be handled by tightening an existing file.

  7. If you add a bundled reference file, add a direct routing entry for it in this SKILL.md.

  8. Prefer checklists, tables, templates, and input/output examples over explanatory prose.

  9. Follow only the specific artifact-layout, workflow-mechanic, Claude-specific, and output-contract references selected for this skill.

  10. For advanced execution shapes, add the required routing, delegation, or safety contracts before considering the skill complete.

  11. For authoring/generator skills, include transformed examples in references:

  • happy-path

  • secure/robust variant

  • anti-pattern + corrected version

  1. Read references/skill-evals.md when the request asks for evals, regression cases, benchmark cases, or model-graded quality checks for the skill being authored.

  2. After any skill artifact changes, run the post-change precision pass in references/authoring-path.md before description optimization or validation.

Step 5: Optimize description quality

Read references/description-optimization.md.

  1. Validate should-trigger and should-not-trigger query sets.

  2. Reduce false positives and false negatives with targeted description edits.

  3. Keep trigger language generic across providers unless the skill is intentionally provider-specific.

Step 6: Register and validate

Read references/registration-validation.md.

  1. Apply repository registration steps for the active layout you verified in the workspace.

  2. Run quick validation for structural checks.

  3. Review validator warnings, precision-pass results, and coverage gaps with judgment before completion.

Output format

Return:

  1. Summary

  2. Changes Made

  3. Validation Results

  4. Open Gaps

Files

scripts/quick_validate.py

# /// script
# requires-python = ">=3.12"
# dependencies = ["pyyaml"]
# ///
"""
Quick structural validation for Agent Skills.

Validates that SKILL.md exists, has valid frontmatter, declares the required
fields, and references bundled files that exist. Size checks are advisory
warnings.

Usage:
    uv run quick_validate.py <skill_directory>

Returns exit code 0 on success, 1 on failure. Outputs JSON with validation
results.
"""

import argparse
import json
import re
import sys
from pathlib import Path

import yaml

MAX_SKILL_CHARS = 20000

LOCAL_FILE_REFERENCE_RE = re.compile(
    r"(?<![A-Za-z0-9_./-])"
    r"((?:references|scripts|assets)/[A-Za-z0-9][A-Za-z0-9._/-]*\.[A-Za-z0-9]+|"
    r"(?:SPEC|SOURCES)\.md)"
    r"(?![A-Za-z0-9_./-])"
)


def parse_args(argv: list[str]) -> argparse.Namespace:
    parser = argparse.ArgumentParser(
        description="Validate the structural requirements for an agent skill.",
    )
    parser.add_argument("skill_directory")
    return parser.parse_args(argv)


def find_local_file_references(text: str) -> list[str]:
    refs: list[str] = []
    for match in LOCAL_FILE_REFERENCE_RE.finditer(text):
        ref = match.group(1)
        if ref not in refs:
            refs.append(ref)
    return refs


def validate_local_file_references(
    skill_path: Path,
    skill_content: str,
    errors: list[str],
) -> None:
    for rel_path in find_local_file_references(skill_content):
        target = skill_path / rel_path
        if not target.exists():
            errors.append(f"Referenced file not found: {rel_path}")
        elif not target.is_file():
            errors.append(f"Referenced path is not a file: {rel_path}")


def validate_skill(
    skill_path: Path,
) -> tuple[bool, list[str], list[str]]:
    """Validate a skill directory. Returns (valid, errors, warnings)."""
    errors: list[str] = []
    warnings: list[str] = []

    skill_md = skill_path / "SKILL.md"
    if not skill_md.exists():
        return False, ["SKILL.md not found"], []

    content = skill_md.read_text()

    if not content.startswith("---"):
        errors.append("No YAML frontmatter found (file must start with ---)")
        return False, errors, warnings

    match = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
    if not match:
        errors.append("Invalid frontmatter format (missing closing ---)")
        return False, errors, warnings

    frontmatter_text = match.group(1)
    try:
        frontmatter = yaml.safe_load(frontmatter_text)
        if not isinstance(frontmatter, dict):
            errors.append("Frontmatter must be a YAML mapping")
            return False, errors, warnings
    except yaml.YAMLError as exc:
        errors.append(f"Invalid YAML in frontmatter: {exc}")
        return False, errors, warnings

    invalid_keys = [key for key in frontmatter.keys() if not isinstance(key, str) or not key.strip()]
    if invalid_keys:
        errors.append("Frontmatter keys must be non-empty strings")

    if "name" not in frontmatter:
        errors.append("Missing required field: name")
    else:
        name = frontmatter["name"]
        if not isinstance(name, str):
            errors.append(f"name must be a string, got {type(name).__name__}")
        else:
            name = name.strip()
            if not name:
                errors.append("name must not be empty")
            elif name != skill_path.name:
                errors.append(f"name '{name}' does not match directory name '{skill_path.name}'")

    if "description" not in frontmatter:
        errors.append("Missing required field: description")
    else:
        description = frontmatter["description"]
        if not isinstance(description, str):
            errors.append(f"description must be a string, got {type(description).__name__}")
        elif not description.strip():
            errors.append("description must not be empty")

    if len(content) > MAX_SKILL_CHARS:
        warnings.append(
            f"SKILL.md is {len(content)} characters (recommended max {MAX_SKILL_CHARS}). "
            "Consider moving optional detail to references/."
        )

    validate_local_file_references(skill_path, content, errors)

    return len(errors) == 0, errors, warnings


def main() -> None:
    args = parse_args(sys.argv[1:])
    skill_path = Path(args.skill_directory).resolve()
    if not skill_path.is_dir():
        print(json.dumps({"valid": False, "errors": [f"Not a directory: {skill_path}"]}))
        sys.exit(1)

    valid, errors, warnings = validate_skill(skill_path)
    result = {
        "valid": valid,
        "errors": errors,
        "warnings": warnings,
    }
    print(json.dumps(result, indent=2))
    sys.exit(0 if valid else 1)


if __name__ == "__main__":
    main()

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.

Needs: Needs Python

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

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
Sentry
Publisher
Sentry (Official)
Source
getsentry/skills · skills/skill-writer · commit e94f222
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 Sentry or Sentry.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download skill-writer.zip