Versioning

The foundation of an ecosystem is "the interface does not change at 2 a.m.". Version policy comes before features.

Version numbers

Skills declare a protocol version

{
  "name": "downloads-cleanup",
  "version": "0.1.0",
  "protocol": "0",
  "entry": "./index.ts"
}

The kernel checks protocol on load:

Breaking-change process

  1. Open an RFC under rfcs/: what changes, why, which skills are affected, how to migrate;
  2. at least 7 days of discussion;
  3. ship a compatibility shim or a migration script with the change;
  4. put a three-step migration guide at the top of the CHANGELOG entry.

The protocol is frozen as data

spec/protocol-v0.json is the contract: action kinds, required fields, assertion kinds, undo kinds, capability ids, journal fields, manifest fields and the five invariants. packages/core/src/protocol.ts holds the same lists as runtime constants, and scripts/protocol-freeze-test.ts fails if either side drifts — including "added a kind but forgot to bump the version".

spec/fixtures/v0-legacy-sample.json is a golden action sequence written at freeze time; scripts/compat-test.ts runs it, undoes it, and asserts the filesystem returns to empty. Any kernel change that breaks it is a breaking change by definition.

Snapshot tests

Every skill runs two checks in CI:

This is the last gate against "an upgrade broke someone else's skill".

Deprecation

Layout

rfcs/          proposals
docs/          this site (English)
docs/zh-CN/    Chinese translation
CHANGELOG.md   release notes

The most valuable asset of an ecosystem project is not the code — it is whether people dare depend on it. Version discipline *is* that asset.