The Problem
Consider a scenario:- Claude Code 1.x reads MCP server configs from
.claude/mcp.json - A package ships
apm/claude-code/mcp/server-config.json - Claude Code 2.x changes to
.claude/mcp_servers.jsonand uses a different schema - All existing packages break on Claude Code 2.x
APM Version Tags
A versioned APM moniker is a child of the unversioned moniker:In the Fallback Graph
claude-code-2 install walks the full chain. A package that only ships apm/claude-code/ content still works on claude-code-2 via fallback — it just uses the older content. The publisher is responsible for updating their package to add apm/claude-code-2/ when the breaking change requires it.
What Counts as a Breaking Change
A breaking change in a platform is an event that causes previously working package content to fail or behave incorrectly on the new platform version. Breaking changes (trigger a new versioned moniker):| Category | Examples |
|---|---|
| Configuration schema changes | MCP JSON field renames or removals; settings.json format changes |
| Hook event changes | Event name renames, removal of matcher support, payload schema changes |
| Install path changes | .claude/ moving to .claude-code/ or similar |
| File format changes | Skill file format changes from Markdown to a structured format |
| API changes | Claude Code plugin API breaking changes |
| Category | Examples |
|---|---|
| Additive schema changes | New optional fields in mcp.json |
| Performance improvements | Faster hook execution |
| New capabilities | New hook event types added (old ones still work) |
| UI changes | Different display of skills or commands in the IDE |
Fallback Graph Behavior
Most-Specific Match Wins
Given aclaude-code-2 install:
- Files in
apm/claude-code-2/are installed (highest specificity) - Files in
apm/claude-code/are installed whereapm/claude-code-2/has no override - Files in
apm/claude/→apm/ai/→shared/fill in the rest
apm/claude-code/ content continues to work on claude-code-2 via fallback — it will use the claude-code content on a claude-code-2 host.
Unknown Versioned Monikers
Clients MUST:- Silently skip
apm/{unknown-moniker}/directories during extraction - Not fail and not warn the user when an unknown moniker directory is encountered
- Log the skipped moniker for diagnostics (at
debugverbosity or lower)
apm/claude-code-3/ content continue to install correctly on older aipkg CLI versions that don’t know about claude-code-3.
Deprecation Policy
When a platform version is discontinued (e.g., a host platform drops support for a major version):- The moniker is marked
deprecatedin the canonical table - The registry shows a deprecation notice on package detail pages for packages that target only the deprecated moniker
- The moniker is never deleted — forward compatibility is a hard guarantee
- Package authors receive email notification (if opted in) when their targeted platform is deprecated
Communication of Breaking Changes
Platform maintainers communicate breaking changes via the registry’s platform changelog:Publisher Guidance
When a platform you target introduces a breaking change:Read the changelog
Fetch
GET /v3/platforms/{moniker}/changelog and review the breakingChanges for the new versioned moniker.Determine impact
Assess whether your package’s content in
apm/{moniker}/ is affected by the breaking change.If affected: add a new target directory
Add
apm/{moniker}-{version}/ to your package with content updated for the new platform version.shared/ Stability
Content in shared/ is by definition platform-agnostic. It is immune to platform breaking changes because it does not rely on any platform-specific schema or path.
Normative Rules for Clients
Clients implementing theaipkg install behavior MUST comply with the following:
- Unknown monikers MUST be silently skipped. Clients MUST NOT fail or warn the user when encountering
apm/{unknown-moniker}/directories. - Unknown monikers SHOULD be logged at
debugverbosity for diagnostics. - Fallback resolution MUST walk the full chain. A
claude-code-2install must still applyapm/claude-code/,apm/claude/,apm/ai/, andshared/content in order. - Monikers MUST NOT be deleted from client implementations based on their deprecation status. A deprecated moniker in the canonical table must remain valid for resolution purposes.