Best for
- Creating a new skill from scratch
- Improving an existing skill
- Reviewing skill quality
event4u-app/agent-config/src/skills/skill-writing/SKILL.md
Use when deciding 'should this be a skill or a rule?', creating/improving/reviewing agent skills, SKILL.md frontmatter, or procedure sections — even without saying 'skill-writing'.
Decision brief
', creating/improving/reviewing agent skills, SKILL. md frontmatter, or procedure sections — even without saying 'skill-writing'.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/skill-writing"Inspect the Agent Skill "skill-writing" from https://github.com/event4u-app/agent-config/blob/798a65522c7a73b90526641d6d1589fe0937cb5f/src/skills/skill-writing/SKILL.md at commit 798a65522c7a73b90526641d6d1589fe0937cb5f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Before writing, inspect the landscape: grep src/skills/ and src/rules/ for duplicates or near-matches, and analyze 1–2 gold-standard peers (e.g. pest-testing, php-coder) to anchor shape and tone. If requirements are unclear or incomplete, stop and ask — do not assume.
Use numbered, verifiable steps.
Workflow sequencing, preconditions, ID/output provenance ("copy ids verbatim, never from memory"), a mandatory "why" intent field, and turn-end contracts belong INSIDE this artifact's description/frontmatter — where they fire at the decision point — not in always-on prose. See t…
Creating a new skill from scratch Improving an existing skill Reviewing skill quality Deciding what belongs in a skill vs a rule
Create executable skills, not documentation Ensure every skill answers: When? How? What output? Prevent common mistakes: too broad, too generic, missing validation
Permission review
The documentation asks the agent to create, modify, or delete local files.
| Already covered by an existing skill/rule/guideline | **Update** | Extend the existing file |The documentation asks the agent to create, modify, or delete local files.
**Grade** — for each scenario, write a `grade.json` file withEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 7 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Use this skill when:
Typical examples:
Do not use this skill when:
Before creating anything, classify the content:
| If the content is... | Then it is... | Action |
|---|---|---|
| An always-true constraint ("never X", "always Y") | Rule | Create/update .augment/rules/ |
| A step-by-step workflow with decisions and validation | Skill | Create/update .augment/skills/ |
| A coding convention or reference material | Guideline | Create/update .augment/guidelines/ |
Baseline model knowledge (how jq works, what docker exec does) | Nothing | Do not create anything |
| Simple tool usage without complex workflow | Nothing | Do not create anything |
| Already covered by an existing skill/rule/guideline | Update | Extend the existing file |
Ask: "Does the model need this to do its job correctly?"
.claude/skills/ namespaceSkills in src/skills/{name}/SKILL.md AND commands in
src/domains/{domain}/{name}/command.md both project into
.claude/skills/ (see scripts/condense.ts →
generate_claude_skills + generate_claude_commands). Claude treats
the whole directory as native skills.
Implications for skill authors:
generate_claude_commands honors this).
Don't reuse a command's slug for a skill unless the command should
retire.description for routing. A weak skill
description is shadowed by a stronger same-domain command — and vice
versa. Make trigger phrasing precise (§ 1b below)./foo" path AND a "model
picks this up from intent" path, author the skill first and let the
command delegate (skills: frontmatter). Two artifacts with the same
trigger surface fight each other in the router.Do NOT create a skill or rule for:
→ See docs/guidelines/agent-infra/size-and-scope.md for full limits.
Before writing, inspect the landscape: grep
src/skills/ and src/rules/ for duplicates or
near-matches, and analyze 1–2 gold-standard peers (e.g. pest-testing,
php-coder) to anchor shape and tone. If requirements are unclear or
incomplete, stop and ask — do not assume.
Then run the Understand → Research → Draft sequence from the
artifact-drafting-protocol
rule. Skip only on explicit "just do it" bypass or trivial edits
(typo, link, single-line clarification).
The skill count keeps climbing; nothing forces "should this be a new skill at all?". Before creating a new skill, answer these in the PR body — a new skill that cannot answer them is a merge / guideline / no-op in disguise:
core or lab? Which pack?Surface overlap before deciding — run ./scripts-run src/scripts/skill_overlap
(or audit_skill_overlap) and read the nearest matches; a high-overlap hit is a
merge signal, not a green light. This gate is the authoring-time companion to the
capability-boundary matrix: the
matrix governs packs, this governs the skills inside them.
Write "When to use" first. This is the in-body trigger — it documents the workflow's entry conditions for anyone reading the skill.
Good: Use when creating Laravel middleware for request filtering
Bad: Use when working with Laravel
The description: field is what Claude reads at routing time. Polite or
generic descriptions cause undertriggering. Normative source:
skill-quality rule § Description Triggering.
Three rules: name 2+ triggers (domains, symptoms, user phrasing), end with
... even if they don't explicitly ask for \`., and stay **≤ 200 characters** (skill_linter.tserrorsdescription_too_longabove that — a hard cap). When trimming to fit, drop adjectives or the second example phrasing before you drop a trigger class or theeven if ...` tail.
Canonical before/after (2026-04-21 audit baseline):
# Bad (138 chars, polite, single trigger class):
description: "Use when writing Playwright E2E tests — browser automation,
visual regression testing, Page Objects, fixtures, and reliable test
patterns."
# Good (pushy, second trigger class, explicit tail):
description: "Use when writing Playwright E2E tests — locators, assertions,
Page Objects, fixtures, CI, and flaky test prevention — even if the user
doesn't say Playwright."
The good version routes correctly on "my E2E keeps flaking on CI"
without naming Playwright. Run ./scripts-run src/scripts/audit_skill_descriptions
after writing; if flagged too-short or no-trigger-prefix, rewrite
before commit.
When iterating on phrasing with the user (e.g. "make this pushier",
"will this ever fire"), delegate to the
description-assist skill — it runs the
approval-gated propose / pick loop with at most two rounds.
When creating a new skill, propose a stub
src/skills/{name}/evals/triggers.json before writing
the body. Draw the queries from Phase A of the drafting protocol (the
user's "should trigger" and "must not trigger" answers).
Stub shape — 5 should-trigger + 5 should-not-trigger queries, first-person, single-sentence, no leakage of the skill name in the queries:
{
"skill": "{name}",
"description": "5 should-trigger + 5 should-not-trigger queries. No query mentions '{name}' directly. Near-misses share domain vocabulary without being the actual task.",
"queries": [
{"q": "<phrasing from user Phase A that MUST route here>", "trigger": true},
{"q": "<another should-trigger phrasing>", "trigger": true},
{"q": "<...3 more>", "trigger": true},
{"q": "<near-miss sharing vocabulary but different task>", "trigger": false},
{"q": "<another near-miss>", "trigger": false},
{"q": "<...3 more>", "trigger": false}
]
}
Present the stub as a numbered-options prompt (per user-interaction):
> 1. Accept stub as drafted — commit alongside the skill
> 2. Edit queries before commit
> 3. Skip evals for now — create later
Nothing is committed without the user's pick. If the user picks skip,
record it in the commit message (Eval stub: deferred). Peer examples
for the expected format: php-coder/evals/triggers.json,
eloquent/evals/triggers.json, skill-writing/evals/triggers.json.
Presence is CI-enforced for new skills: check_trigger_eval_presence
fails any skill outside the shrink-only grandfather allowlist that
lacks evals/triggers.json — skip therefore defers the queries'
quality, never the file itself.
Rules / commands / guidelines do not get eval stubs — only skills route through the top-level catalogue.
Use numbered, verifiable steps.
Good:
Bad:
End with concrete validation.
Good:
Bad:
Show minimal contrast.
Good:
Bad:
Control response structure.
Example:
Triggers (evals/triggers.json) check routing. A separate
evals/evals.json checks behavior — does the skill make the agent
produce a better answer than baseline? Add this layer for any skill
where the procedure has measurable output (commands, artifacts,
structured text). Skip for evergreen heuristics with no falsifiable
output (e.g. direct-answers, language-and-tone) unless the user
asks for it.
Workspace layout (all under .gitignore):
src/skills/{name}/evals/
triggers.json # tracked — routing eval (§ 1c)
evals.json # tracked — behavior eval definitions
runs/ # gitignored — per-iteration outputs
{timestamp}-baseline/ # sub-agent run without the skill
{timestamp}-with-skill/ # sub-agent run with the skill
{timestamp}-benchmark.json
evals.json shape — 3–10 scenarios, each with prompt + grading
rubric:
{
"skill": "{name}",
"scenarios": [
{
"id": "happy-path",
"prompt": "<full user-shaped task that exercises the skill>",
"assertions": [
{"kind": "contains", "value": "<expected substring in output>"},
{"kind": "file_exists", "path": "<artifact path the skill should create>"},
{"kind": "rubric", "criterion": "<one-line judgement, e.g. 'output includes a numbered procedure'>"}
]
}
]
}
contains / file_exists grade deterministically. rubric items grade
via a fresh sub-agent reading the output against the criterion — keep
each criterion to one falsifiable sentence.
Loop (orchestrated by scripts/run_skill_evals.ts):
./scripts-run src/scripts/run_skill_evals scaffold {skill}
creates runs/{timestamp}-{baseline,with-skill}/ and seeds each
scenario's meta.json.runs/{timestamp}-baseline/{scenario-id}/.runs/{timestamp}-with-skill/{scenario-id}/.grade.json file with
per-assertion pass/fail. Deterministic assertions auto-grade;
rubric assertions need a grader sub-agent../scripts-run src/scripts/run_skill_evals aggregate {skill} --run {timestamp} produces runs/{timestamp}-benchmark.json with
pass-rate, timing, token deltas baseline-vs-with-skill../scripts-run src/scripts/run_skill_evals report {skill} --run {timestamp} prints the diff. Iterate on the skill body
until with-skill outperforms baseline on every scenario.The script ships with sub-agent spawning stubbed — the orchestration layer is per-environment (Claude Code, Augment, council). Implement the spawn function once for your environment, the rest of the loop (aggregate / report / scaffold) works out of the box.
Exit criterion — every scenario passes with-skill, at least one
fails baseline (proves the skill earns its slot). Commit the
evals.json alongside the skill; never commit runs/.
Neighbors:
description-assist — iterate on the trigger phrasingskill-reviewer — structural 7-Killers auditlint-skills — static checks (frontmatter, sections, size)skill-improvement-pipeline — production-learning capture../../docs/guidelines/<group>/<name>.md,
../../docs/contracts/<name>.md). The condense-time rewriter
resolves them to depth-aware single-up form — do not pre-rewrite in
source.load_context: / load_context_eager:;
those frontmatter keys are rule-only. If a skill needs to point at a
context, link to it inline ([context-name](../../contexts/<area>/<file>.md))..agent-src.uncondensed/ in any skill body link or
example — it ships into .augment/skills/ and breaks consumer
resolution. See rule-writing § 3b for the canonical reference.Skills may declare an execution frontmatter block (type, handler,
timeout_seconds, safety_mode, allowed_tools). Default is manual
(instructional only). See docs/guidelines/agent-infra/runtime-layer.md for
the full specification and assisted / automated semantics.
project-analysis-* skillOnly if the framework has its own lifecycle producing unique debugging
patterns that project-analysis-core cannot explain (e.g. Laravel,
Symfony, Express, React, Next.js). Not for Tailwind, CSS frameworks,
utility libs, or simple state managers.
### sub-headings./scripts-run src/scripts/skill_linter before saving — 0 FAIL requiredApply the Frugality Charter to every skill you author.
Examples in this artifact:
## Procedure
opens with the action ("Run the linter"), not "Let me walk you
through…".## Status / ## Summary block.Pre-save self-check:
A script shipped inside a skill (scripts/**) is side-effect-free by
default — it inspects, computes, and prints; it does not mutate the
filesystem. Any mutation (writing a file, deleting, rename/copy) must be gated
behind an explicit flag named in this SKILL.md — --writable / --apply /
--write / --output / --fix — so the default invocation is safe to run
blind. A generator whose declared purpose is to write (it emits an artifact
to a caller-supplied path) is allowlisted with a rationale in
src/scripts/lint_skill_scripts_readonly_allowlist.json rather than carrying a
redundant flag. lint_skill_scripts_readonly enforces this: an ungated,
non-allowlisted write fails the build.
Descriptions are the trigger surface; tune them like a model, not like prose:
evals/triggers.json has should- AND should-not-trigger queries
(grow beyond the 5+5 stub when optimizing — more queries = a real test split).npx tsx src/scripts/optimize_skill_description.ts --skill <id> --candidate "…" [--candidate "…"] [--live] — it splits the
queries deterministically into train/held-out, scores every candidate
(deterministic token-overlap proxy by default; --live = haiku judge,
~$0.001 per query·candidate), and picks the best held-out accuracy.For skills whose product is a rendered/structural artifact (decks, docs, diagrams, dashboards, generated UI): assume there are problems and have a fresh-eyes pass find them before handing back. The author-context is blind to its own omissions; a context-free verifier is not.
Worked example (deck skill): the author renders 12 slides; the fresh-eyes pass gets the PDF + "check overflow, contrast, orphaned bullets, broken images" — it flags a clipped title on slide 7 the author never re-read. One fix, one re-check, done.
Scope: complements verify-before-complete (which gates the completion
claim); this pattern is HOW to get the fresh evidence for artifacts where no
deterministic checker exists. Skip it when a real validator covers the
surface (linter, schema, test) — deterministic checks beat judge passes.
Tool/integration skills teach the happy path; the recurring support burden is
the silent failures — the ones that cost money, corrupt state, or fail with no
error. For a high-support-burden tool skill, add a ## Known pitfalls section
in this micro-format:
A Symptom → Root cause → Fix table. Each row starts from the observable symptom (what the user sees), not the internal cause — the user greps for the symptom, not the fix.
| Symptom | Root cause | Fix |
|---|---|---|
<what the user observes> | <why it happens> | <the concrete action> |
Optionally, a quick-reference anti-pattern checklist (Anti-pattern ·
cost/impact · fix difficulty) for traps worth scanning before shipping — add
it only when it does not restate the skill's existing ## Gotcha / ## Do NOT; the table is the load-bearing part.
Sourcing floor — real, not invented: every entry names a genuinely common
failure (a high-vote community question, a documented incident class), never a
hypothetical. ≤ 5 entries per skill. The value is a short, sourced,
high-signal list; a long one is noise. A pitfall is a section on the existing
tool skill, never a new skill per pitfall and never a generated grid (see
size-enforcement § Per-tool pitfall
content).
docs/guidelines/agent-infra/size-and-scope.md)Workflow sequencing, preconditions, ID/output provenance ("copy ids verbatim,
never from memory"), a mandatory "why" intent field, and turn-end contracts
belong INSIDE this artifact's description/frontmatter — where they fire at the
decision point — not in always-on prose. See
tool-description-as-policy.
Alternatives
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
JasonColapietro/suede-creator-skills
Suede-owned experimentation discipline for hypotheses, sample sizing, test duration, significance, and repeatable experiment programs. Use when comparing variants, deciding whether a result is reliable, or building an experiment backlog and cadence. NOT FOR: analytics instrumentation (use suede-analytics), post-click conversion diagnosis (use suede-site-alchemy), or writing the variant copy itself (use suede-copy).
narrative-io/narrative-skills-marketplace
Translate a fuzzy analytical question into a rigorous investigation plan. Interrogates the ask, grounds the plan in the available data dictionary, applies analytical best practices, and produces a structured brief of query specifications for a downstream query-writing skill. Plans, does not write SQL. Use when: "why did X drop", "is there a relationship between A and B", "who are our highest-value customers", "what's driving the change in Y", "investigate this trend", "design an analysis for", "