Outcome
Your agent follows a written procedure instead of improvising one, the procedure lives in one place your team can edit, and every session launched from the template loads it. You can import an existing skill from a git repository and keep it in sync.Decide
A skill is the runbook. The harness reads the skill’s description to decide when to use it, then follows the body. Answer these before writing one. What does an experienced operator do, step by step?- Bad: “Investigate the payment and explain what happened.”
- Good: “1. Pull the charge and every related payment intent from Stripe. 2. Look up the account’s limits in the
account_policyview. 3. Match the processor decline code against the table inreferences/decline-codes.md. 4. Separate what the processor said from what our own policy did. 5. Write the draft in the template inreferences/reply-template.md.”
- Bad: “Payment stuff.”
- Good: “Use whenever a request mentions a declined card, a duplicate charge, a missing refund, a transaction reference like
TX-orch_, or a customer asking why a payment failed.”
- Bad: leave
requiresempty and hope the org connections are there. - Good:
requires.integrations: [stripe, postgres, zendesk]so the connections are materialized and any missing one is reported.
What a skill is

Settings > Context > Skills. One live row per skill, attached to templates, repos or the whole org.
SKILL.md, plus any sibling files: a references/ folder for tables and templates, a scripts/ folder for helpers, subfolders with their own SKILL.md for sub-skills. It is stored as a skill_v0 item with the entry name, the file list and an optional requires block. Files up to 64 KiB are stored inline; larger ones go to object storage and are fetched by the sandbox.
The frontmatter is the authoring contract:
nameis lowercase, hyphen separated, matching^[a-z0-9][a-z0-9-]*$. It becomes the directory name in the sandbox.descriptionis the only text the harness sees when deciding whether to use the skill. State what it does and when to use it, naming the phrases a person would actually type. Harnesses under-trigger skills, so be specific and a little pushy.
Do it
Write a skill from the dashboard
1
Start a new skill
Go to Settings > Context > Skills and click New skill. You can write the
SKILL.md inline, scan a GitHub repo for existing skills, or open a session in which the harness drafts the skill with you and you publish it from the session.2
Add reference files
Add the files the runbook cites. Keep long tables and templates out of
SKILL.md and in references/ so the entry stays short enough to read every time.3
Declare required tools
Set
requires.integrations to the provider slugs the runbook uses. The platform materializes those connections for any template the skill is attached to and reports unmet ones in the session manifest.4
Attach it
Attach the skill to the agent’s template. Use a repo attachment when the skill is about one codebase, or All when every agent in the org should have it.
5
Rebuild the template
Attachments reach sessions only through a build.
Import from a git repository
1
Scan the repo
Point the importer at a GitHub repository. It walks the tree once and lists every
SKILL.md under a .claude/skills/ or .cursor/skills/ folder, marking ones already imported.2
Import the candidates you want
Import all of them or only chosen paths, and attach them in the same call. Sibling files up to 512 KiB are bundled; the total is capped at 5 MiB.
3
Keep it in sync
Resync re-reads the source and rebuilds only when content changed. The skill remembers the commit it was imported from.
Load into a running session
For a quick test without a rebuild, hot-load a skill into a live session. It is written into the session’s skills directory immediately and does not change the template.Lock a finished skill
Example: a payments runbook
SKILL.md
references/decline-codes.md
requires.integrations: ["stripe", "postgres", "zendesk"], the sandbox gets STRIPE_SECRET_KEY, POSTGRES_CONNECTION_STRING and the Zendesk variables, and reports if any of them is not connected.
Verify
- The skill exists once.
Skillsshows one row with the right name and description. - It is attached. The skill’s attachments list the agent’s template, and
template getshows it underskills. - The build includes it. Build status is
readyand the template is not flagged as changed since build. - A session has the files. In a session from the template,
ls ~/.claude/skills/<name>/showsSKILL.mdand the reference files. - It triggers. Send a prompt using one of the phrases from the description and check that the harness reads the skill before acting.
Gotchas
- Created but never attached. The most common failure.
template getshowsskills: []. Attach and rebuild. - Attached after the build.
attachments_changed_since_build: true. Rebuild. - Vague description. The harness never picks the skill because the description does not match how people phrase requests. Rewrite it with concrete trigger phrases.
- Missing frontmatter. A markdown file without the
---block imports but never triggers as a skill. - Unmet requirement.
requires.integrationsnames a provider that is not connected. The session boots and the manifest lists the unmet requirement; the runbook fails at the first vendor call. Connect the provider. - Editing a locked skill. Updates return an error until an admin unlocks it. Locking is for freezing, not a review step.
- Import path filter. Discovery matches only
SKILL.mdfiles under.claude/skills/or.cursor/skills/. ASKILL.mdat the repo root is not found; import it with--source github_urland the file URL.