Step 3 of #1277. It lands in the single pull request for #1277 (branch feat/1277-skills).
What
- Where the choice is kept. Three places hold the same two lists,
on: [names] and off: [names]. The narrowest scope that names a skill wins; otherwise the skill is off. Every write goes through one engine door.
| Scope |
Where |
| global |
~/.codeaf/skills.json |
| project |
<project>/.codeaf/skills.json |
| conversation |
the conversation's meta.json |
- Catalog. Skills that are on are listed in
message[0] (name, one-line description, size), beside the standing orders and folders. The catalog changes only when a setting changes or a folder is attached.
- The
skill tool. Its name is constrained to the skills that are on. It returns the body wrapped as <skill name="…" dir="…">…</skill>, with the skill's bundled files listed. Relative paths resolve against dir, and the skill's folder is allow-listed for read.
- Absent, not broken. With no skill on, neither the catalog nor the tool exists.
- Every pull is visible. Each call draws its own transcript row naming the skill and its size, for example
used skill pdf-processing · 3.1 KB. It is never folded into prose.
- Loaded once. A second pull of the same skill in one conversation returns a short "already loaded". Compaction keeps a loaded skill.
allowed-tools pre-approves nothing.
- Words.
prompts/system.md says what a skill is and when to open one. docs/CHAT-V3.md's "dropped skills & rules" line is invalidated by this pull request's change entry.
Acceptance, end to end
Real binary with a stub model:
- With
pdf-processing turned on globally, the request's system prompt lists it, and the tools include skill with pdf-processing in its enum.
- When the stub calls
skill with pdf-processing, the transcript draws used skill pdf-processing · followed by its size. The tool result carries the body and the skill's dir.
- With nothing on, the request has no
skill tool and no catalog section.
- A project
skills.json turning the skill off overrides the global on. A conversation turning it on overrides the project off.
- The belt gate names
skill. The manual answers "which skills can you use on your own?".
Step 3 of #1277. It lands in the single pull request for #1277 (branch
feat/1277-skills).What
on: [names]andoff: [names]. The narrowest scope that names a skill wins; otherwise the skill is off. Every write goes through one engine door.~/.codeaf/skills.json<project>/.codeaf/skills.jsonmeta.jsonmessage[0](name, one-line description, size), beside the standing orders and folders. The catalog changes only when a setting changes or a folder is attached.skilltool. Itsnameis constrained to the skills that are on. It returns the body wrapped as<skill name="…" dir="…">…</skill>, with the skill's bundled files listed. Relative paths resolve againstdir, and the skill's folder is allow-listed forread.used skill pdf-processing · 3.1 KB. It is never folded into prose.allowed-toolspre-approves nothing.prompts/system.mdsays what a skill is and when to open one.docs/CHAT-V3.md's "dropped skills & rules" line is invalidated by this pull request's change entry.Acceptance, end to end
Real binary with a stub model:
pdf-processingturned on globally, the request's system prompt lists it, and the tools includeskillwithpdf-processingin its enum.skillwithpdf-processing, the transcript drawsused skill pdf-processing ·followed by its size. The tool result carries the body and the skill'sdir.skilltool and no catalog section.skills.jsonturning the skill off overrides the global on. A conversation turning it on overrides the project off.skill. The manual answers "which skills can you use on your own?".