Author skill
Use this skill whenever you author, edit, rewrite, split, merge, or move a skill — a Tale-specific repo-dev guide under .agents/skills/, a generic workflow skill whose source of truth is builtin-configs/skills/ and is projected into .agents/skills/, or a product-only skill under builtin-configs/skills/. It covers the description-as-invocation rule, the canonical SKILL.md skeleton, progressive disclosure, the five failure modes to prune against, leading words, which home a skill belongs in, and the AGENTS.md index + PROJECTED_SKILLS allowlist + sync every skill ships with. Load it before touching any SKILL.md, and never hand-edit a generated .claude/skills mirror or a projected .agents/skills copy.From its SKILL.md
npx -y skills add tale-project/tale --skill author-skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 6 commands, including `bun run skills:sync` and 5 more.
SKILL.md
10.7 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it
author-skill
A skill exists to wrangle determinism out of a stochastic system — so the agent runs the same
process every time, not so it emits the same output. Predictability is the root virtue; every rule
below serves it. A sloppy skill (stale paths, a vague description, 400 inline lines) is worse than
none. Copy SKILL_TEMPLATE.md for the shape; this skill is the why.
Write a note first
Invoke write-notes and record your answers to this form before you author or edit the skill:
- Skill & home: Describe the skill, the home it belongs in (
.agents/skillsvsbuiltin-configs/skills), and the single concern it owns. - Invocation: Describe its directive description — the situation and triggers that should make the agent load it.
- Overlap: Describe what existing skill or section it overlaps and how you'll reuse or fold rather than duplicate.
- Risks & unknowns: Describe where this skill might mislead an agent or collide with another, and how you checked.
The description does the invocation work
The agent decides whether to load a skill from its description alone — so it gets harder pruning
than the body, and it must command the agent into the skill in the right situation, not merely
describe it. A description that reads like a summary gets skipped; one that names the trigger and
enforces the skill wins.
- Lead with the directive + the situation. Open
Use this skill whenever <concrete situation> …(orRead before <trigger> …) — the capability and the command to load it, in a first sentence that stands alone (a terse harness listing may show only it). - Enumerate the triggers exhaustively, one per branch. The real file paths, verbs, and symptoms
someone hits when they need it (
"fix", a pasted stack trace, editingconvex/**). Distinct situations, not synonyms; adjectives aren't triggers. Over-cover rather than under-cover — a missed trigger is a skipped skill. - Enforce it. Close with the boundary (the sibling that owns the adjacent case — for a defect, use
fix-bug) and a "never do X without it" clause, so the agent can't default to a generic approach in the skill's situation. - Say nothing the body repeats. Identity, rationale, and how-to belong in the body.
The shape (copy the template)
SKILL.md ≤ ~150 lines, scannable in seconds:
- Frontmatter —
name(== directory, dash-case) +description. Nothing else (that is all every harness reads). - Opener (1–2 sentences) — what it covers + the boundary, linking the sibling that owns the adjacent case. Lead with the rule, not preamble.
## When this applies— mirror the description triggers; name real globs.## The rules— non-negotiables, each with its why in the same breath. Name the guard that enforces it (enforced by …) or mark itreviewer-caught.## Patterns— minimal real do/don't,path:linewhen it helps. The smallest snippet that makes the point.## Companion files(only when depth warrants) — each with a one-line "read when".
Where a skill has a done-gate or a must-not-skip sequence (a "before you call it done", a pre-flight
gate), write it as a true - [ ] checklist opened with "tick every box, or N/A with a reason; an
unticked box means not done". A box the agent fills in beats a paragraph it skims (see Premature
completion).
Progressive disclosure — three tiers
Rank every line by immediacy: in-skill steps (what every run needs) → in-skill reference
(rules + patterns) → external pointer (a companion .md or a sibling skill). Inline what every
branch needs; push behind a pointer what only some branches reach. Keep a concept's definition,
rules, and caveats co-located under one heading — don't scatter it.
Prune against the five failure modes
Audit every skill — new or edited — against these. The fix for most is delete, not reword.
- No-ops — a line the model already obeys by default. Test each sentence: does it change
behaviour vs. the default? "Write clear names", "handle errors", "be careful" all fail — cut them.
If a real rule reads weak, sharpen its leading word (
be thorough→relentless); don't add a sentence. - Duplication — one meaning in two places. Pick the owner skill; everyone else links it
(
../<skill>/SKILL.md). One edit, one place. - Sediment — stale layers that accreted because adding felt safe and removing felt risky. Cite
only verified paths:
ls/grep/read every path and command on the current branch before writing it. A stale reference is worse than no reference. - Sprawl — long even when every line is live and unique. Disclose reference behind a pointer; split only when the cut earns it.
- Premature completion — the agent stops a sequence early. Make done-vs-not-done a true
- [ ]checklist it must tick — each box a verifiable assertion, N/A allowed with a reason; only split to hide later steps if the rush survives a sharp checklist.
Leading words
A leading word is a compact concept the model already thinks with — it anchors behaviour and invocation in fewer tokens. Collapse a restated phrase into one: "fast, deterministic, low-overhead" → tight. Reach for a sharper word before you reach for another sentence.
One concern; mind the invocation axis; don't duplicate the ecosystem
If the name needs "and", it's two skills — fold a tiny adjacent topic into a section rather than spawn
a near-empty skill. Invocation axis: a .agents/skills/ skill is model-invoked — it
surfaces by its description, and may also be human-invoked by name (/fix-bug, /create-pr,
/review-pr) — these invocable workflows are themselves skills, not separate command files. Author a skill only when the agent (or another skill) must reach it on
its own. And if a built-in/harness skill already does the job (react-doctor, code-review,
claude-api), reference it — a custom skill must add Tale-specific value.
Homes — pick by audience
Decide who runs the skill, then pick its source of truth — three cases:
- Repo-dev guide (Tale-specific, docs only) →
.agents/skills/<name>/. The source every coding agent reads;skills:syncmirrors it into.claude/skills/for Claude Code. May use repo paths and link siblings by file.author-skillandwrite-translationslive here. - Generic workflow skill (a senior-dev workflow that ALSO ships to product org agents) → source of
truth under
builtin-configs/skills/<name>/, with its name in thePROJECTED_SKILLSallowlist intools/skills/src/sync.ts.skills:syncprojects it into.agents/skills/<name>/and on to.claude/skills/. Because it ships to agents working on any codebase, it must be generic and portable — no repo paths, no Tale rule names; cross-reference siblings by slug in prose, never by file link.implement-feature,fix-bug, … live here. - Product skill →
builtin-configs/skills/<name>/(the document skillsdocx/pdf/pptx/xlsx, the org-entity authoring skillswrite-agent/write-workflow/write-skill/write-integration/write-automation,web-research, and the Bun-workspacevisual-aspect-analyzer— all embedded in the CLI binary and seeded per-org identically). Everything here except the document skills is also inPROJECTED_SKILLS, so repo-dev agents get it too.visual-aspect-analyzeris additionally baked into the sandbox image (services/sandbox-runtime/Dockerfile) with its deps installed — that baked copy wins in sandbox sessions. (The productwrite-skillteaches ORG agents to author org skills; this repo-dev standard isauthor-skill— two different audiences, two skills.)
Never hand-edit a generated copy. .claude/skills/<name>/ is a mirror; .agents/skills/<workflow>/
is a projection of its builtin-configs/skills/ source — edit the source, then bun run skills:sync.
Scaffold any home with bun run gen skill (it prompts for the category). A shipped skill may carry
runnable code in <skill>/scripts/, invoked skill-relative (bun scripts/<name>.ts /
python scripts/<name>.py); bun scripts must be self-contained (only node:*, bun/bun:*, relative
imports — skills:check enforces it).
Register it — non-negotiable
Adding a skill means adding its row to the skill index in /AGENTS.md;
removing one removes that row; renaming updates it. The index is the map every agent reads — if it
lies, agents load the wrong thing. Every builtin-configs skill that is not a document skill
also needs its name in the PROJECTED_SKILLS allowlist in
tools/skills/src/sync.ts so it projects into the guides. Then run bun run skills:sync (the
@tale/skills tool) to regenerate every projection and the .claude/skills/
mirror. Same change, every time.
Before the skill ships — tick every box
- Frontmatter is
name(== directory, dash-case) +descriptiononly — nothing else. - The description commands the agent into the skill — directive opener (
Use this skill whenever …), exhaustive triggers, an enforcement / boundary clause, first sentence standing alone. - Pruned against the five failure modes — no no-ops, no duplication, every cited path verified on this branch, ≤ ~150 lines, and any done-gate written as a true
- [ ]checklist. - Registered — its row is in the
/AGENTS.mdindex (and, for any builtin-configs skill that is not a document skill, its name is inPROJECTED_SKILLS). -
bun run skills:syncrun, and the regenerated.claude/skills/mirror (+ any projection) committed. -
bun run skills:checkpasses — no drift, every shippedSKILL.mdscript ref resolves, bun scripts self-contained.