skills/writing-skills/SKILL.md
House style for authoring and maintaining Mozilla CI agent-skills in this repo. Use when creating, editing, or reviewing a SKILL.md, the description frontmatter, references/, or scripts/ — covers description style, gotchas convention, scope-vs tables for log tools, hard-coded paths, and mozdata: handoffs.
npx skillsauth add jwmossmoz/agent-skills writing-skillsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
House style for the skills in this repo. The agentskills.io spec covers the mechanics (frontmatter fields, file layout); this guide is the opinionated layer that comes from running these skills against real Mozilla CI work.
When in doubt, reach for /skill-creator — it covers the eval loop
(scripts/run_loop.py) which this guide deliberately does not duplicate.
The description is a routing trigger, not documentation. It's loaded into every session, so every word costs the user every time. Aim for ≤50 words.
Required shape:
tc-logview), one sentence starting with DO NOT
USE FOR that names the alternative. Negative routing matters more
than positive routing — adjacent skills that share keywords will
mistrigger without it.Forbidden patterns:
Triggers on "x", "y", "z"... keyword bags. They look helpful and
are not. Keywords belong in the description prose if they're load-
bearing, otherwise they're noise.Example — bad:
description: >
Query logs from SolarWinds (formerly Papertrail) using paperctl.
Use when: (1) downloading logs (2) searching log entries
(3) investigating CI failures. Triggers: "papertrail", "pull logs",
"worker logs", "download logs", "search logs"
Example — good:
description: >
Query and download in-VM Taskcluster worker logs from SolarWinds
Observability (formerly Papertrail) using paperctl v2.0. Use when
investigating what a worker process or its OS reported on-host. DO NOT
USE FOR provisioning failures where no worker started (use tc-logview)
or Azure-side VM lifecycle events (use splunk).
Every skill's SKILL.md must include:
BUGZILLA_API_KEY env var; read-only ops work without auth").~/.claude/skills/<skill-name>/scripts/<script>.py. Never hardcode
~/github_moz/agent-skills/... — that breaks for anyone else and
breaks if the checkout moves.Optional but encouraged:
references/ for detail that doesn't
need to be in the always-loaded body.A gotcha is something that would surprise a reader who knows the tool but doesn't know this skill's quirks. Examples that earned their place:
taskcluster task retrigger for Firefox CI — it clears
upstream dependencies." (taskcluster)treeherder-cli --similar-history takes a job ID (numeric), not a
task ID." (treeherder, worker-image-investigation)Each gotcha should be checkable: a future reader could verify it, or it points at a specific symptom and remedy. Don't put generic best- practice advice here ("always test your queries"); that's noise.
Mozilla has four overlapping log surfaces, and they're easy to confuse:
| Tool | Scope | Source |
|---|---|---|
| splunk skill | Azure activity log — control-plane events for VMs/disks/NICs | index=azure_audit |
| papertrail skill | In-VM events from the running worker | SolarWinds Observability |
| tc-logview (CLI, not a skill) | Taskcluster's worker-manager + worker-scanner views | GCP Cloud Logging |
| taskcluster skill | Live task logs and artifacts | Taskcluster API |
Any skill that touches one of these surfaces must include a similar table in its body so readers (and agents) understand the boundary. Without it, an agent will pick the wrong tool and waste a turn.
Don't reference /Users/jwmoss/... or ~/github_moz/... anywhere in
SKILL.md or scripts. Use either:
~/.claude/skills/<skill-name>/scripts/<script> — the symlinked
install path (Claude Code reads from ~/.claude/skills/).TC=~/.claude/skills/taskcluster/scripts/tc.py
~/.agents/skills/ is the canonical install location (npx skills
manages it); ~/.claude/skills/ is the symlinked view. SKILL.md
should reference the symlinked view because that's where Claude Code
runtime resolves paths.
When telemetry-adjacent skills (bigquery, redash, daily-log) need to
find probes or write production-quality SQL, hand off to the
mozdata: plugin skills rather than duplicating their content:
mozdata:probe-discovery — find Glean metrics and probesmozdata:query-writing — production-quality BigQuery SQLmozdata:airflow-debugging — DAG failuresReference them in ## Related Skills, not the description. They live
in a separate plugin and shouldn't be assumed to exist; describe them
as "if available" when they're optional.
SKILL.md is loaded in full whenever the skill triggers. Keep it
under 500 lines. When you exceed that, split into references/:
references/REFERENCE.md — long-form technical referencereferences/<topic>.md — domain-specific (e.g. tc-logview.md,
azure-commands.md, presets.yml)Link from the body with one-line guidance: "See references/x.md
when you need <X>." Don't make the reader hunt for context.
For skills with multiple variants (e.g. multi-cloud, multi-OS), organize references by variant:
worker-image-build/
├── SKILL.md (workflow + which config picks which variant)
└── references/
├── azure-trusted.md
├── azure-untrusted.md
└── examples.md
Skill body picks the variant; the agent only reads the relevant reference file.
Required fields per the agentskills.io spec:
name — lowercase letters, numbers, hyphens. Must match the parent
directory name. ≤ 64 chars.description — see "Description style" above. ≤ 1024 chars (hard
limit), ≤ 50 words (this repo's soft cap).Optional and worth using:
metadata.version — bump on substantive changes. Helps diffs.metadata.author — for skills authored by someone other than the
repo owner.Avoid non-spec fields (when_to_use, argument-hint outside metadata,
custom keys at root). They're silently ignored by some hosts and trip
spec validators.
Every substantive skill should ship evals/evals.json with a mix of
positive and negative trigger cases. The negatives matter more — they
catch over-triggering, which is the more common failure mode for
keyword-heavy skills.
/skill-creator covers the full eval loop and the scripts/run_loop.py
description optimizer. Don't reinvent that here. Minimum viable:
{
"skill_name": "<name>",
"evals": [
{"id": 1, "prompt": "...", "should_trigger": true},
{"id": 2, "prompt": "...", "should_trigger": false}
]
}
Aim for 8-10 positive + 8-10 negative near-misses. Generic queries ("write a fibonacci function" as a negative for a PDF skill) don't test anything; the valuable negatives are queries that share vocabulary with the skill but actually need a different tool.
Ask the same question on every paragraph: would the agent get this wrong without this content? If no, cut it.
Before merging a skill change:
Triggers on lists.DO NOT USE FOR if
there's overlap./Users/ or ~/github_moz/ paths.## Gotchas section exists with at least one bullet (or is
labeled "no known gotchas yet — please add as they come up").evals/evals.json exists for skills shipping to multiple users.metadata.*.development
Download Azure Cost Management exports and query local Parquet/CSV in DuckDB. Use when refreshing local Azure cost caches or writing DuckDB SQL over exports. DO NOT USE FOR live Cost Management API diagnosis; use azure-cost-analysis.
data-ai
Use when creating performance self-reviews from local notes, prior reviews, review prompts, and verified evidence. Helps draft H1/H2, annual, and promotion self evaluations, example answers, and rich review-form paste output. Do not use for routine status or 1:1 summaries; use one-on-one.
tools
Prepare one-on-one/status bullets from ~/moz_artifacts using qmd and copy a topic-organized HTML/RTF list with embedded links to the macOS clipboard. Use when summarizing recent Mozilla work for a manager, 1:1, or status update. DO NOT USE FOR generating raw daily logs; use daily-log.
development
Use when tracing Taskcluster Azure VM startup from worker-manager request through in-VM boot scripts to generic-worker `workerReady` with tc-logview, paperctl, Splunk Web, and Yardstick Prometheus. Applies to Windows worker provisioning latency. DO NOT USE FOR task failure triage (use worker-image-investigation).