Problem
The campaign/festival skills exist in two separate, hand-maintained places that have already drifted, and nothing keeps them in sync:
- camp (canonical):
projects/camp/internal/scaffold/campaign/templates/.campaign/skills/<name>/SKILL.md.tmpl, materialized into a workspace's .campaign/skills/ by camp init. Serves an installed campaign workspace.
- Plugin bundle:
claude-plugin/skills/<name>/SKILL.md in this repo, shipped inside the Claude Code / Codex / Cursor / opencode / Gemini plugin bundles. A plugin must carry its own skills because it loads them from <plugin>/skills/ and installs before camp exists.
FP0006 makes claude-plugin/ the single source of truth for the plugin packaging and enforces drift from claude-plugin/ to the four generated targets. But it does not address the upstream relationship: claude-plugin/skills/ is itself a divergent copy of camp's canonical skills.
Current divergence (as of 2026-06-16)
|
camp (canonical) |
claude-plugin (plugin) |
| only-here skills |
camp-workitems, cross-campaign, fest-standalone-workflows |
fest-methodology |
| format |
SKILL.md.tmpl (rendered) |
static SKILL.md |
| count |
10 |
8 |
So the sets differ in both directions, the formats differ, and a content edit to a shared skill in camp does not propagate to the plugin bundle (and vice versa).
Options to decide later
- Generate from camp: render/sync
claude-plugin/skills/ from camp's SKILL.md.tmpl and add a drift check, so the plugin bundle cannot silently diverge from the canonical source. Likely its own camp + festival design effort.
- Intentional curated set: treat
claude-plugin/skills/ as a deliberately curated plugin subset, document that explicitly, and scope the "single source of truth" wording to the packaging layer.
Scope note
This is out of scope for FP0006 (PR #68), which correctly packages whatever is in claude-plugin/. Filing to track the deeper camp <-> claude-plugin skills source-of-truth decision.
Problem
The campaign/festival skills exist in two separate, hand-maintained places that have already drifted, and nothing keeps them in sync:
projects/camp/internal/scaffold/campaign/templates/.campaign/skills/<name>/SKILL.md.tmpl, materialized into a workspace's.campaign/skills/bycamp init. Serves an installed campaign workspace.claude-plugin/skills/<name>/SKILL.mdin this repo, shipped inside the Claude Code / Codex / Cursor / opencode / Gemini plugin bundles. A plugin must carry its own skills because it loads them from<plugin>/skills/and installs before camp exists.FP0006 makes
claude-plugin/the single source of truth for the plugin packaging and enforces drift fromclaude-plugin/to the four generated targets. But it does not address the upstream relationship:claude-plugin/skills/is itself a divergent copy of camp's canonical skills.Current divergence (as of 2026-06-16)
camp-workitems,cross-campaign,fest-standalone-workflowsfest-methodologySKILL.md.tmpl(rendered)SKILL.mdSo the sets differ in both directions, the formats differ, and a content edit to a shared skill in camp does not propagate to the plugin bundle (and vice versa).
Options to decide later
claude-plugin/skills/from camp'sSKILL.md.tmpland add a drift check, so the plugin bundle cannot silently diverge from the canonical source. Likely its own camp + festival design effort.claude-plugin/skills/as a deliberately curated plugin subset, document that explicitly, and scope the "single source of truth" wording to the packaging layer.Scope note
This is out of scope for FP0006 (PR #68), which correctly packages whatever is in
claude-plugin/. Filing to track the deeper camp <-> claude-plugin skills source-of-truth decision.