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
Section titled “Canonical input”id: pr-reviewdescription: Apply before opening a PR. Tests, security, performance.activation: agentallowed-tools: [Read, Grep]## Tests- [ ] Unit tests added## Security- [ ] No secrets in diffRendered output per harness
Section titled “Rendered output per harness”.claude/skills/pr-review/SKILL.md
---name: pr-reviewdescription: Apply before opening a PR. Tests, security, performance.allowed-tools: [Read, Grep]---
## Tests- [ ] Unit tests added## Security- [ ] No secrets in diffWhy 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 diffWhy 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 diffWhy 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
Section titled “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
Section titled “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
Section titled “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
Section titled “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.