Harness comparison¶
A single canonical skill produces correct output for every harness — proper frontmatter schema, proper activation, proper aggregation, proper size budgets. This page shows what gets written and why.
Canonical input¶
# skill.yaml
id: pr-review
description: Apply before opening a PR. Tests, security, performance.
activation: agent
allowed-tools: [Read, Grep]
Rendered output per harness¶
.claude/skills/pr-review/SKILL.md
---
name: pr-review
description: Apply before opening a PR. Tests, security, performance.
allowed-tools: [Read, Grep]
---
## Tests
- [ ] Unit tests added
## Security
- [ ] No secrets in diff
Why correct: Claude Code's progressive disclosure relies on name + description for
activation; allowed-tools enforces the security boundary.
.cursor/rules/pr-review.mdc
---
description: Apply before opening a PR. Tests, security, performance.
---
## Tests
- [ ] Unit tests added
## Security
- [ ] No secrets in diff
Why correct: Cursor's "Agent Requested" mode activates rules whose description
matches the current task — description-only frontmatter, no alwaysApply. (always
skills get alwaysApply: true; globs skills get globs: + alwaysApply: false.)
Verbatim Claude frontmatter would leave description valid but add unrecognized
name/allowed-tools keys.
.opencode/skill/pr-review/SKILL.md
# pr-review
Apply before opening a PR. Tests, security, performance.
## Tests
- [ ] Unit tests added
## Security
- [ ] No secrets in diff
Why correct: OpenCode doesn't require frontmatter and prefers narrative markdown.
AGENTS.md (aggregated)
<!-- adeptability:begin id=pr-review hash=a1b2c3d4 -->
## Apply before opening a PR. Tests, security, performance.
## Tests
- [ ] Unit tests added
## Security
- [ ] No secrets in diff
<!-- adeptability:end id=pr-review -->
When multiple skills are enabled, they are packed by priority descending then byte size
ascending, emitted in skill-id order. If the total exceeds 32 KiB (Codex's
project_doc_max_bytes), the lowest-priority skills drop and a truncation manifest appears
at the top:
<!-- adeptability: omitted 2 skill(s) due to 32KiB budget. Trim or split skills to fit. Dropped: legacy-style,old-runbook -->
Why correct: Codex has no per-skill concept. It reads one or more AGENTS.md files
walking up from cwd. Naive copy-as-SKILL.md is invisible to Codex; the 32 KiB cap means
quiet truncation if you don't manage it.
Copilot has no agent-requested mode, so this activation: agent skill is skipped
(see the activation table below). A skill with activation: always renders into
.github/instructions/always.instructions.md:
---
applyTo: "**"
---
<!-- adeptability:begin id=pr-review hash=a1b2c3d4 -->
## Apply before opening a PR. Tests, security, performance.
## Tests
- [ ] Unit tests added
## Security
- [ ] No secrets in diff
<!-- adeptability:end id=pr-review -->
Skills with activation: globs bucket into a per-glob file like
.github/instructions/bucket-a63d8819677675ea.instructions.md with
applyTo: "**/*.ts,**/*.tsx".
Why correct: Copilot uses applyTo glob match to decide when to inject the
instructions. Without it, the file is loaded for the wrong files or ignored entirely.
Activation translation table¶
| Canonical activation | Claude | Cursor | OpenCode | Codex | Copilot |
|---|---|---|---|---|---|
always |
description-only | alwaysApply: true |
# id + desc + body |
aggregated body | applyTo: "**" |
globs: [...] |
desc + glob hint | globs: + alwaysApply:false |
# id + desc + body |
aggregated body | bucketed by globs |
agent |
description-only | description-only | # id + desc + body |
aggregated body | skipped (no agent mode) |
manual |
disable-model-invocation:true |
desc + @id hint |
# id + desc + body |
aggregated body | skipped |
Sidecars¶
Skills can bundle scripts/, references/, assets/. Where supported:
- Claude Code: full sidecar tree preserved.
- OpenCode: full sidecar tree preserved.
- Cursor: dropped (single-file); a warning is reported on
sync. - Codex: dropped (aggregator file model); a warning is reported on
sync. - Copilot: dropped (aggregator file model); a warning is reported on
sync.
Beyond the specialized five¶
Everything above describes the five specialized renderers. 50+ more agents (Windsurf,
Gemini CLI, Cline, Continue, Roo, Goose, Junie, …) render through generic per-skill adapters
that write SKILL.md into that agent's convention. Run adept harness list for the live
registry, or add your own with a config-driven adapter.
Why this matters¶
Prior art treated multi-harness sync as a path-multiplexing problem (write one file into N
paths). That breaks activation in Cursor and Copilot, produces nothing usable in Codex, and
silently loses size budget. adept makes content fidelity to each harness's actual loader the
headline guarantee — and proves it with golden files any contributor can inspect.