Versioning and ownership#

Versions#

Semver is required#

Every skill version must follow semantic versioning: MAJOR.MINOR.PATCH. The server rejects versions that don’t match this format.

Examples of valid versions: 1.0.0, 2.3.1, 0.1.0

Examples of invalid versions: v1.0.0, 1.0, latest, 2024-01-15

Versions are immutable#

Once a version is published, its content cannot be changed. The primary key constraint on (skill_name, version) enforces this at the database level. If you publish my-skill@1.0.0, that content is fixed. To update the skill, publish 1.0.1 or 1.1.0.

Immutability means installs are reproducible. If you pin a version and record its SHA-256 digest, you can verify the content has not changed:

skillsctl install my-skill@1.0.0 --digest sha256:abc123...

latest_version tracking#

The registry tracks a latest_version field for each skill. When a new version is published, latest_version is updated only if the new version is semver-greater than the current latest. Publishing an old version (e.g., a backport to 1.x while 2.0.0 is current) does not change latest_version.

skillsctl install my-skill without a version specifier installs latest_version.

Changelogs#

Each version can include a changelog message. Pass it with --changelog when publishing:

skillsctl publish \
  --name my-skill \
  --version 1.1.0 \
  --description "..." \
  --file my-skill.md \
  --changelog "add output format instructions, fix typo in section 2"

Changelogs are stored with each version and help users decide whether to update.

Digest verification#

Every version has a SHA-256 digest computed from its content. The digest is displayed when you publish:

Published my-skill@1.0.0 (sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)

Pin a version with its digest to detect if the content has been tampered with:

skillsctl install my-skill@1.0.0 --digest sha256:e3b0c44...

If the digest does not match, installation fails.

Ownership#

Keyed on OIDC subject#

Skill ownership is tied to the OIDC subject (sub claim) of the user who first published the skill. The subject is an opaque identifier assigned by the OIDC provider - it does not change when the user updates their email or display name.

Using subject instead of email means:

  • A user who changes their email retains ownership of their skills
  • Ownership is stable across provider-side profile updates
  • Two accounts at the same provider always have different subjects

What ownership enforces#

Once a skill is owned by a subject, only that subject can publish new versions of it. Other users receive an error if they attempt to publish to a skill name they don’t own.

Ownership is established on first publish. There is no separate ownership claim step.

Admin override#

Admin users (members of the group specified by OIDC_ADMIN_GROUP) can publish to any skill regardless of ownership. This allows platform admins to take over unmaintained skills or handle off-boarding.

Transferring ownership#

Ownership transfer is not currently supported through the CLI. An admin can update the owner field directly in the database if needed.

Next steps#

  • Auth model - how OIDC subjects are established
  • Security - how immutability and digests fit into the security model