skill-authoring
Use when a lesson must become a skill, here or in a profile.
SKILL.mdDocumentation/Skill/Skill-Authoring/SKILL.md
GitHubSkill Authoring
A procedure that worked is written into this repository, not into the agent's own profile. The failure this prevents is invisible while it happens: a session learns how this tree builds or publishes, saves the lesson under a profile directory, and every clone of this repository starts without it. The person who owns the tree then watches their own tooling forget.
Nothing tracked may name a person or a machine path. This skill governs where a lesson lives and what shape it takes.
When to Use
- A procedure worked and the next session would have to rediscover it.
- A lesson exists in an agent profile and describes this repository rather than a method.
- A skill directory, its frontmatter, its index or its citation disagrees with the tree.
- Deciding whether a lesson belongs here or in the agent's profile.
Where a skill lives
Documentation/Skill/<Name>/SKILL.md the rules
Documentation/Skill/<Name>/Reference/ the worked instances and the tools
Documentation/Skill/<Name>/Reference/Index.md what that directory holds
.agents/skills is a symlink to Documentation/Skill/, so a tool that looks for .agents/ finds
the same files rather than a copy. Git stores the link; a checkout with core.symlinks=false writes
a small text file whose content is ../Documentation/Skill, and the long path still works.
The repository root AGENTS.md carries the task → skill table. It is the index: a skill nobody is
pointed at is not loaded. Documentation/README.md carries the reader-facing list of the same
directories, and both are read together, because a skill the loader finds and the reader does not is
a folder nobody opens.
The naming
- The directory is
PascalCase-Kebab:Tool-Archive,Timeline-Site-Build,RFC-Board. - The frontmatter
nameis that directory lowercased:tool-archive,timeline-site-build. - The
descriptionis one sentence beginningUse when; it names the trigger, not the topic. - The body carries its claims in a
## Claim → testtable, or in a## Verificationtable under the same rule. A## Referenceslist may follow the table.
What belongs here, and what does not
The test is one question: would this be wrong for a different repository?
- Wrong elsewhere - this tree's build, storage, transport, board, conventions - belongs here.
- Right anywhere - how to write a skill, how to split work between agents, how a browser tab is driven - belongs in the agent's profile, where every repository gets it.
- A lesson that is both goes in both: the method in the profile, the instance here. Patching only the profile leaves this clone starting from zero, and the next session re-learns what this one already proved.
A skill that ships inside a repository is boilerplate: it describes the class of repository, never
one instance. A project id, an account handle, an absolute path or a token belongs in .env or
Maintain/Configuration/Local/, never in a tracked file - Documentation/Reference/Configure.md
states where each one goes.
What the body holds
- Rules in
SKILL.md; a worked instance inReference/behind a one-line pointer. Reference/Index.mdlists every file in that directory, including the ones with no tool at all - a directory that archives nothing says so and why.- A script that ran belongs to a skill (
Documentation/Skill/Tool-Archive/SKILL.md). A tool that names a machine cannot be archived:archive_tool.py --auditis the gate, and it covers Markdown as well as code, so a skill's prose is held to the same rule as its scripts. - Every rule that asserts behaviour carries the command that proves it, or is marked as intent. A
rule that names nothing is
openin the record header, and reads as unsettled to anyone who checks.
Pitfalls
- A profile skill is shadowed, not merged. A repository skill with the same name wins in a session started inside the repository, so the profile copy is read by nobody and drifts silently.
- A skill written here is invisible to the session that wrote it. The index is built when a session starts; the file is found by the next one. Write it now, and do not conclude from its absence that it was not saved.
- A directory with no
Reference/Index.mdis a half-written skill. The reading order refuses it: the index is where a reader learns what sits beside the prose. - A name typed in two places drifts. The directory and the frontmatter
nameare one fact, and they are changed together, because a rename that misses one leaves a skill nothing can address. - A formatter rewrites prose. Prettier reflows these files at 100 columns with tabs. Run it on the files you touched, never across the tree, and never on a generated artifact.
- A
Reference/test that no root script runs never gates. Nothing in this tree runs a test suite, so a test written beside a tool is hand-run only and a regression in that tool passes review unless someone runs it. Name the raw invocation in the skill's claim table, and run it withpython3 -Bso the run writes no__pycache__beside the tool.
Claim → test
| Claim | Test |
|---|---|
| Every skill has a body and an index | the directory holds SKILL.md and Reference/Index.md |
| The frontmatter name matches its directory | the directory name lowercased is the header's name |
Every skill is cited from AGENTS.md |
grep -c '<Name>/' AGENTS.md returns at least one |
Every skill appears in Documentation/README.md |
grep -c '<Name>/' Documentation/README.md returns at least one |
Every reference file is listed in its Index.md |
ls Reference/ and the index table name the same set |
| Every skill states a testable claim | the body carries a claim table or a ## Verification table |
| The skill tree names no machine path | python3 .../archive_tool.py --audit prints clean: no home paths |
| The tracked tree carries no identifier | review the diff: no tracked file names a person, a handle or a home path |
| The repository's skills load for a session | hermes skills trust <absolute repository root> prints N project skill(s) will load |