Platform Reports
Table of Contents
We ran the same 44 automated checks against each platform and compared what actually happened. Each row below asks one question about platform behavior; the cells say in plain language what each platform did. Rows marked 📌 are where platforms disagree: the cases where a skill that works on one platform behaves differently on another.
Full detail for every finding (the exact verdict, how content reached the model, confidence, and notes) lives on the per-platform pages. Each page opens with a spec alignment summary: where that platform’s observed behavior contradicts or matches what the Agent Skills specification prescribes, and how it handles skills that violate the spec’s format rules.
- Antigravity CLI (headless)
- Claude Code (headless)
- Codex CLI (headless)
- GitHub Copilot CLI (headless)
For what these findings mean in practice, see the guidance for authors, installers, distributors, and harness implementers. The check list has the full rationale behind every question. All findings come from headless sessions, which can differ from interactive use; outcomes marked †rest on behavioral inference rather than direct transcript evidence. Two checks (context compaction protection, trust gating) need interactive sessions and are marked manual.
Loading Timing #
When skill content enters the model’s context, and how much loads at each stage.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| Does the harness read only SKILL.md metadata at discovery, or the full body? | Metadata only †| Metadata only | Metadata only | Metadata only |
| On activation, does the harness load only the SKILL.md body, or also bundled resources, and by which vehicle? | Body only | Body only | Body only | Body only |
| Does activation pre-fetch files markdown-linked from the SKILL.md body, and does that extend to a file mentioned only as plain text? | No pre-fetching †| No pre-fetching | No pre-fetching | No pre-fetching |
Directory Recognition #
Which directories a platform treats as part of a skill, and what happens to ones it doesn’t recognize.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 Are the three spec directories (scripts/, references/, assets/) enumerated to the model at activation? | Nothing enumerated †| Nothing enumerated | Nothing enumerated | All three listed, contents not loaded |
| 📌 Is a resources/ directory (alternative to spec’s references/) loaded, enumerated, readable, or invisible? | Readable when the model looks | Not surfaced; model never looked | Not surfaced; model never looked | Names listed, contents not loaded |
| 📌 What happens to directories the spec never named (evals/, templates/): injected, readable on demand, or invisible? | Readable when the model looks | Readable when the model looks | Not surfaced; model never looked | Names listed, contents not loaded |
Resource Access Patterns #
How supporting files (scripts, references, assets) become available to the model.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 At activation, are a skill’s reference files enumerated to the model (names), loaded outright (contents), or invisible until explored? | Nothing enumerated †| Nothing enumerated | Nothing enumerated | File names listed, contents not loaded |
| 📌 When the model follows a SKILL.md relative path like references/setup-guide.md, what does it resolve against, and does the bare path work as written? | Bare path fails; model recovers | Bare path fails; model recovers | Model used full paths (base untested) †| Bare path fails; model recovers |
| With two skills both owning references/API.md, does the activated skill’s read get its own file or the sibling’s? | Got its own file †| Got its own file †| Got its own file †| Got its own file †|
| Can the model read outside the activated skill’s directory (a sibling skill’s file), and is anything visibly blocked? | Reads outside the skill allowed | Reads outside the skill allowed | Reads outside the skill allowed | Reads outside the skill allowed |
| How deep in the directory tree do reference files stay reachable? Rungs at one, two, three, and five levels. | All depths reachable (tested to 5) | All depths reachable (tested to 5) | All depths reachable (tested to 5) | All depths reachable (tested to 5) |
| 📌 Can the agent run a bundled scripts/ file and receive its output? | Script ran; output returned | Blocked with an error | Script ran; output returned | Blocked with an error |
| 📌 When a skill ships forty numbered references, a hidden dotfile, a binary asset, and a vendored code tree, does the platform’s activation listing carry all of them, stop at a cap, or leave some kinds out? | Nothing enumerated †| Nothing enumerated | Nothing enumerated | Omitted: vendored |
Content Presentation #
What the model actually sees, at discovery and at activation, and how it’s formatted.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 Which frontmatter fields does the discovery listing surface to the model: name and description only, or also compatibility, metadata values, or file locations? | Also surfaces location †| Name and description only | Also surfaces location | Name and description only |
| 📌 Does the SKILL.md YAML frontmatter reach the model at activation, or only the body? | Visible (model reads the raw file) | Stripped before injection | Visible (model reads the raw file) | Stripped before injection |
| 📌 Is injected skill content wrapped in structured tags, or delivered as raw markdown, and what does the model see on pull harnesses? | Raw file via model read | Raw markdown, no wrapper tags | Raw file via model read | Wrapped in structured tags |
| 📌 Does the content injected at activation tell the model where the skill lives on disk (its directory path), apart from any discovery listing? | Injection not recorded †| Skill path stated at activation | Path only in the discovery listing | Skill path stated at activation |
Lifecycle Management #
How skill content is managed over the course of a conversation.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 When the same skill is activated twice in one session, is its content loaded again or deduplicated? | Model re-reads each time | Full content re-injected every time | Model reused its memory †| Full content re-injected every time |
| 📌 After SKILL.md is edited mid-session, does reactivation serve the fresh content or a cached copy? | Edits picked up immediately | Edits picked up immediately | Edit missed; nothing re-read the file | Edits picked up immediately |
| Is skill content protected when the context window fills up? | manual | manual | manual | manual |
Access Control #
How platforms gate skill loading and handle control-related frontmatter.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| Do project-level skills require trust approval before loading? | manual | manual | manual | manual |
| Does a compatibility field naming another platform gate loading, get surfaced to the model, or get ignored? | Loads normally, no gating | Loads normally, no gating | Loads normally, no gating | Loads normally, no gating |
| 📌 Does the experimental allowed-tools field pre-approve anything, compared against an identical skill without it? | Ran with and without the field | Ran with and without the field | Ran with and without the field | Blocked with and without the field |
| 📌 Does the effect of allowed-tools depend on spelling the tool the platform’s way? Three twins declare the same intent as Bash(printf:*), bash, and shell. | Ran under every spelling | Ran under every spelling | Ran under every spelling | Blocked under every spelling |
Skill-to-Skill Invocation #
Whether one skill’s instructions can activate another skill.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| Can one skill’s instructions get a second installed skill activated by name? | Second skill activated | Second skill activated | Second skill activated | Second skill activated |
| How deep does a skill→skill→skill activation chain run before something stops it? | Full three-skill chain completed | Full three-skill chain completed | Full three-skill chain completed | Full three-skill chain completed |
| 📌 When two skills each instruct activating the other, does the A→B→A cycle loop, get blocked, or stop by model choice? | Re-invoked without reloading | Model stopped the loop itself | Model stopped the loop itself | Model stopped the loop itself |
| Does the invoke chain still complete when the activation prompt is Japanese? | Full three-skill chain completed | Full three-skill chain completed | Full three-skill chain completed | Full three-skill chain completed |
Skill Dependencies #
What happens when one skill depends on another, formally or in prose.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| Is a dependency expressed only in prose (“now activate the invoke-beta skill”) resolved at runtime? | Second skill activated | Second skill activated | Second skill activated | Second skill activated |
| 📌 When a skill instructs activating a skill that is not installed, is the failure visible, reported, or silently skipped? | Reported missing without attempting | Failed with a visible error | Attempted; no error shown | Failed with a visible error |
| Does the platform act on nonstandard dependency frontmatter (requires, depends-on, priority)? | Ignored †| Ignored | Ignored | Ignored |
| 📌 Can a project-level skill invoke a dependency that exists only at user level, and what is the failure mode when it is absent? | Resolved across scopes; missing dependency attempted, no error | Resolved across scopes; missing dependency fails visibly | Resolved across scopes; missing dependency fails visibly | Resolved across scopes; missing dependency fails visibly |
Discovery Scope #
Where platforms look for skills: which directories are scanned, how deep, and what happens when two discovered skills claim the same name.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 Is a skill installed only at the cross-client .agents/skills convention path discovered? | Convention path is the native directory †| Convention path not scanned | Convention path scanned | Convention path scanned |
| 📌 Does the skills root get scanned recursively (a skill under a grouping directory), and is a SKILL.md outside any root discovered? | Direct children only; stray file ignored †| Direct children only; stray file ignored | Scans the root recursively; stray file ignored | Scans the root recursively; stray file ignored |
| 📌 Is a SKILL.md nested inside another skill’s references/ tree discovered as a separate skill? | Not discovered †| Not discovered | Discovered as a separate skill | Not discovered |
| 📌 With the same skill name installed at project and user scope, which variant’s content activates? | Project scope wins †| User scope wins | Lists both; model chose the project variant †| Project scope wins |
| 📌 With the same skill name installed under two project roots the platform scans (its native directory plus .agents/skills or .claude/skills), which variant is listed and which activates? | Only the native root is read †| Only the native root is read | Every variant listed; model activated .agents/skills | Native root wins |
Validation Strictness #
How strictly platforms judge skills that break the spec’s format rules: rejected, repaired, or loaded anyway.
| Question | Antigravity CLI | Claude Code | Codex CLI | Copilot CLI |
|---|---|---|---|---|
| 📌 Is a skill whose description holds an unquoted colon (invalid YAML) still discovered and loadable? | Not cataloged; file still readable †| Tolerated and loaded | Tolerated and loaded | Skipped by a strict parser |
| 📌 Is a skill with no description field skipped (as the guide prescribes), or loaded anyway? | Loaded anyway †| Loaded anyway | Not cataloged; file still readable | Loaded anyway |
| 📌 Are skills whose names break the spec’s rules (uppercase, consecutive hyphens, over 64 characters) still discovered and loadable? | All three invalid names tolerated †| All three invalid names tolerated | Tolerated only: uppercase, double-hyphen | Tolerated only: uppercase, double-hyphen |
| 📌 When directory name and frontmatter name disagree, which identity is the skill listed and invocable under? | Frontmatter name wins †| Directory name wins | Listed under both names | Listed under both names |
| Is a skill whose metadata frontmatter holds nulls and empty strings still discovered and loaded, and do those keys reach the model? | Loaded fine | Loaded fine | Loaded fine | Loaded fine |
| 📌 Is a skill whose description exceeds the spec’s 1024-character limit still discovered, and does the full value survive untruncated? | Loaded anyway †| Loaded anyway | Loaded anyway | Skipped |
| 📌 When a platform enforces the 1024-character description limit, does it count Unicode code points, UTF-16 code units, or UTF-8 bytes? | No enforcement (unit is moot) †| No enforcement (unit is moot) | Counts Unicode code points | Counts UTF-16 code units |
| 📌 When a platform enforces the 64-character name limit, does it count Unicode code points, UTF-16 code units, or UTF-8 bytes, or does it reject non-ASCII names regardless of length? | No enforcement (unit is moot) †| No enforcement (unit is moot) | Counts Unicode code points | Rejects non-ASCII names (unit unobservable) |
| Is a skill whose compatibility value exceeds the spec’s 500-character limit still discovered and loadable? | Loaded anyway †| Loaded anyway | Loaded anyway | Loaded anyway |