Skip to content

FCIS RFC 0001: skill parity — identical copies in .codex/skills and .claude/skills - #2

Merged
Contexter merged 1 commit into
mainfrom
fcis/skill-parity
Jul 27, 2026
Merged

FCIS RFC 0001: skill parity — identical copies in .codex/skills and .claude/skills#2
Contexter merged 1 commit into
mainfrom
fcis/skill-parity

Conversation

@Contexter

Copy link
Copy Markdown
Contributor

Why

A Live Drive runbook was authored into .codex/skills/live-drive/ per the current rule, and was then invisible to Claude Code, which discovers skills only under .claude/skills/. The agent that could not see it re-derived the same procedure from scratch across several sessions — precisely the waste the skills layer exists to prevent.

The underlying intent was always "procedures live in the skills layer". What the standard did not say is that agent runtimes do not share a discovery path — Codex reads .codex/skills/, Claude Code reads .claude/skills/. Naming one path silently scoped every skill to one agent.

What changes

A skill MUST exist as an identical copy at .codex/skills/<name>/SKILL.md and .claude/skills/<name>/SKILL.md, with three constraints, each from an observed failure:

constraint failure it prevents
copies, not symlinks symlink discovery is not guaranteed across runtimes; links break on archive export, worktrees, and filesystems that don't carry them
neither path gitignored the symlink bridge sat under a .claude/ gitignore entry and did not ship with the clone
byte-identical content divergence means two agents follow different steps while both believe they are compliant

The repository states which path is the editing origin, so copy direction is never ambiguous.

Where it is enforced

Not only in the rules section — also in Step 1 (Audit), which now compares both paths and checks .gitignore, and in the PR checklist, which now requires both copies. A rule stated but not assessed is not enforced.

… and .claude/skills

Found in practice, not in theory. A Live Drive runbook was authored into `.codex/skills/live-drive/` per the
current rule and was then INVISIBLE to Claude Code, which discovers skills only under `.claude/skills/`. The
agent that could not see it re-derived the same procedure from scratch across multiple sessions — the exact
waste the skills layer exists to prevent.

The underlying rule was always "a procedure lives in the skills layer". What the standard did not say is that
agent runtimes DO NOT SHARE A DISCOVERY PATH: Codex reads `.codex/skills/`, Claude Code reads
`.claude/skills/`. Naming only one path silently scoped every skill to one agent.

Amendment: a skill MUST be discoverable by every agent runtime the repository supports, and therefore MUST
exist as an identical copy at both paths. With three constraints that each come from a real failure mode:

- COPIES, NOT SYMLINKS. A symlink bridge was tried first. Symlink discovery is not guaranteed across runtimes,
  and a link is silently broken by an archive export, a worktree, or a filesystem that does not carry it.
- NEITHER PATH MAY BE GITIGNORED. The same bridge lived under a `.claude/` entry in `.gitignore`, so it did
  not ship with the clone. A skill that does not survive `git clone` is not a skill.
- BYTE-IDENTICAL CONTENT. Divergence is worse than absence: two agents then follow different steps while both
  believe they are compliant.

Also updates the audit step to compare both paths and check `.gitignore`, and the PR checklist to require both
copies — so the rule is enforced where compliance is actually assessed, not only stated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Contexter
Contexter merged commit 24961d3 into main Jul 27, 2026
0 of 2 checks passed
@Contexter
Contexter deleted the fcis/skill-parity branch July 27, 2026 10:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant