SKILL.md), the scripts that do the real work, and any templates or assets they need. The agent isn’t told about skills in Python — it discovers them at runtime by reading files, decides when one applies, follows its rules, and runs its scripts.
This is the natural counterpart to the AutonomousAgent: the agent brings the reasoning and the filesystem/shell tools, and skills bring the standardized, repeatable know-how. Together they turn “an agent that can run commands” into “an agent that knows how your team does things.”
Skills require no new API. An
AutonomousAgent already has the filesystem and shell tools it needs to find, read, and execute a skill. You add a skill by dropping a folder into the workspace and pointing to it from AGENTS.md — no code changes.Why skills exist
Without skills, an autonomous agent improvises every task from scratch. Ask it for “a report” twice and you can get two different layouts. Skills fix that by making the method a first-class artifact:- Consistency — the branding, columns, and formatting come from a template file, not from whatever the model invents that run.
- Progressive disclosure — the agent only loads a skill’s full details when a task actually needs it, keeping context lean even with dozens of skills installed.
- Evolvability — adding or improving a capability means editing a folder, not redeploying code.
- Guardrails — a skill states its own rules (“never hand-write Excel; always call
generate.py”), and the agent respects them.
Anatomy of a skill
A skill is just a directory underworkspace/skills/. Each one owns a SKILL.md plus whatever scripts, templates, and assets it needs:
| Part | Role |
|---|---|
SKILL.md | The contract. When to trigger, how to invoke, arguments, hard rules. |
Scripts (e.g. generate.py) | The deterministic work. Formatting/branding lives here, not in the model. |
templates/ | Declarative config (layout, colors, columns) the scripts read. |
assets/ | Logos, fonts, and other static files the scripts embed. |
Writing a SKILL.md
SKILL.md is a plain Markdown file written like a briefing for a capable colleague. It tells the agent when the skill applies, how to run it, and what it must never do. Here is the excel_report skill from the example below:
SKILL.md
SKILL.md should have:
When to Use — the trigger
When to Use — the trigger
Concrete phrases and situations that should activate the skill. This is what the agent matches a request against. Be specific: “reports, exports, spreadsheets, ‘last 2 weeks’ report’.”
Usage — the exact invocation
Usage — the exact invocation
The precise command and arguments. The agent will run this verbatim through its shell tool, so include real paths and a full example.
Important — the hard rules
Important — the hard rules
The non-negotiables that keep the skill’s guarantees intact: “Never write Excel manually,” “don’t modify
generate.py; add a new template instead.” The agent treats these as boundaries, not suggestions.Registering a skill in AGENTS.md
The agent finds skills becauseAGENTS.md tells it where to look and when to use each one. AGENTS.md is the index and routing table; each SKILL.md is the detailed manual the agent opens only when routed there.
AGENTS.md
AGENTS.md is injected into the system prompt automatically. So at the start of every run the agent already knows the skill catalog and the routing rules — without any of the skills’ bulky details. It opens the full SKILL.md only once a task routes to it. That is progressive disclosure, and it’s what lets the model scale to many skills without bloating context.
How skills and the autonomous agent work together
The connection between the two is files, not code. The agent never imports a skill. It discovers, respects, and (when needed) extends a skill purely by reading and running files in the workspace.AGENTS.md + SKILL.md are the contracts that bind them. None of this behavior is hardcoded in Python — it emerges from the workspace files plus the model’s reasoning.
Walkthrough: a skill in a live run
This is a real, observed run of anAutonomousAgent paired with the excel_report skill. It shows the whole loop — discover, respect, extend, verify, remember — and is the best way to understand the combo.
The driver: a terminal chat over the workspace
chat.py wires a Chat session to an AutonomousAgent pointed at the workspace. That’s the entire integration — there is no mention of skills in this file.
chat.py
excel_report skill only outputs .xlsx. Here is how the agent handled it, across four phases.
Orient — read the contracts and the data
Before producing anything, the agent followed the order
AGENTS.md imposes: it read SOUL.md (identity), scanned memory/ for prior runs, opened skills/excel_report/SKILL.md, then looked at the actual data (data/onboarding.csv) and even generate.py to understand what the skill really produces.Its own framing: “The skill makes Excel, you asked for PDF. Let me read the context and check the data first.” Critically, it identified the skill’s boundary (.xlsx only) and the user’s real ask (PDF) before writing a single line.Probe the environment
The agent checked what tools were available for PDF generation:
check_command_exists libreoffice (missing), soffice (missing), then probed Python and found reportlab, pandas, and openpyxl already installed. It decided to generate the PDF with reportlab — but to pull layout and branding from the same template the Excel uses, so the two formats stay identical.Run the skill — and face the data
It invoked the skill as
SKILL.md documents it: generate.py --filter last_month returned “No data after filtering.” Instead of shipping an empty report, the agent diagnosed why: today is 2026-06-09, but every CSV record is from 2026-04-28 to 2026-05-05, so a rolling 30-day window catches nothing. It fell back to an explicit range covering the real data and got a valid report (12 rows) — and flagged the staleness to the user honestly.Extend, verify, remember
To fill the PDF gap, the agent did not bypass or modify the skill (Same template, same colors, same status coloring (
SKILL.md forbids editing generate.py). Instead it added a sibling script, to_pdf.py, that reuses the skill’s own logic:to_pdf.py
HUMAN REVIEW → yellow, COMPLETED → green) — just a PDF renderer. It generated the file, verified it (1 page, landscape A4, branding intact), and wrote the session and its lessons to memory/2026-06-09.md so the next session starts smarter.What the agent produced
reports/onboarding_2026-06-09_last_month.xlsx— the skill’s standard output.reports/onboarding_2026-06-09_last_month.pdf— the requested format, branded identically.skills/excel_report/to_pdf.py— a new capability added to the skill ecosystem without breaking it.memory/2026-06-09.md— a continuity note: “this data is stale; rolling-window filters return empty; useto_pdf.pyfor PDFs.”
Design principles this run reveals
Skills are discovered, not embedded
Skills are discovered, not embedded
The agent learned the skill at runtime by reading
SKILL.md. Adding a new skill = a new folder + a SKILL.md + a routing line in AGENTS.md. The agent’s code never changes.The agent respects the skill's boundaries
The agent respects the skill's boundaries
AGENTS.md said “never hand-write Excel.” The agent always produced Excel through generate.py. Branding lived in the template, not in the model’s improvisation.Gaps are filled by extending, not bypassing
Gaps are filled by extending, not bypassing
PDF wasn’t supported. The agent didn’t fake a table or edit
generate.py (forbidden). It added a sibling script that reuses the skill’s logic — the ecosystem grew, the guarantees held.The agent confronts the truth of the data
The agent confronts the truth of the data
An empty filter result wasn’t silently shipped. The agent found the cause, told the user, and chose a sensible fallback — behavior that flows from
SOUL.md’s “have opinions / flag what looks off.”Memory closes the loop
Memory closes the loop
The agent wrote what it learned to
memory/. The next session reads it and avoids repeating the same discovery. Skills + memory compound over time.Adding a new skill
Create the folder
Make
workspace/skills/<skill_name>/ (kebab or snake case, matching how you’ll reference it).Write SKILL.md
Add a
SKILL.md with When to Use, Usage (exact command + arguments), and Important (the hard rules). Write it like a briefing — concise and actionable.Add scripts, templates, and assets
Put the deterministic work in scripts and the formatting/branding in templates. Keep decisions out of the model so output stays reproducible.
Register it in AGENTS.md
Add the skill to the Available skills list and the Routing Rules table so the agent knows when to reach for it.
Next steps
AGENTS.md
How the workspace contract is loaded into the system prompt and used to route to skills.
Filesystem Tools
The read/write/search tools the agent uses to discover and run skills.
Memory Integration
How cross-session memory lets skill usage compound over time.
Folder Organizer Example
A complete autonomous agent driven entirely by a workspace skill file.

