TfP Docs

Skill schema

Generated from the canonical schema schemas/skill.schema.json by scripts/generate-schema-docs.mjs — do not edit this page by hand.

Canonical (Stage 3A, owner-approved 2026-09-01). The stable registry identity for one reusable agent skill. Skill contents are NOT a TfP format: every version is an Agent Skills-compatible package (agentskills.io — SKILL.md plus standard supporting files); TfP adds registry identity, provenance, immutable versioning, discovery/curation, and ProblemRevision attachment. Any User may publish a Skill independently of any Campaign; the display address @{handle}/{slug} is derived presentation from the publisher's CURRENT handle — renaming a handle changes the display address but never the Skill's identity or any reference (durable references use ids). First-party TfP Skills use the same mechanism, published by a first-party publisher account (e.g. @tfp). Campaigns curate/recommend Skills; they do not own a separate kind of Skill. Organization publishing is deferred. The current/default version is derived: the highest version_number whose yanked_at is null. Agent Skills package metadata lives on each SkillVersion.

Schema version: 0.2.0 · $id: https://tokensforprogress.org/schemas/skill.schema.json

Fields

id

Type: string · Required: yes · Mutable: no · Pattern: ^skl_[0-9a-z]{10,32}$

Stable opaque identifier — the durable identity every reference uses. Canonical URL: /skills/{id}.

Example: "skl_01jf95aa1lean"

slug

Type: string · Required: yes · Mutable: yes · Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$

URL-safe short name, unique WITHIN the publisher's Skills (publisher_user_id + slug), not globally. Appears in the derived display address @{handle}/{slug} and pretty URLs; never a durable reference.

Example: "lean-mathlib-proving"

publisher_user_id

Type: string · Required: yes · Mutable: no · Pattern: ^usr_[0-9a-z]{10,32}$

The User who publishes/maintains this Skill on TfP (registrant). Ownership and the derived namespace hang off this stable id. Publishing is distinct from authorship: an imported Skill's underlying content may be authored upstream by someone else — see SkillVersion source provenance.

Example: "usr_01jf8xw3tempo"

created_at

Type: string · Required: yes · Mutable: no

RFC 3339 UTC timestamp of creation.

Example: "2026-09-01T10:00:00Z"

updated_at

Type: string · Required: yes · Mutable: yes

RFC 3339 UTC timestamp of the most recent change to any mutable field.

Example: "2026-09-01T10:00:00Z"

JSON Schema source

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tokensforprogress.org/schemas/skill.schema.json",
  "title": "Skill",
  "description": "Canonical (Stage 3A, owner-approved 2026-09-01). The stable registry identity for one reusable agent skill. Skill contents are NOT a TfP format: every version is an Agent Skills-compatible package (agentskills.io — SKILL.md plus standard supporting files); TfP adds registry identity, provenance, immutable versioning, discovery/curation, and ProblemRevision attachment. Any User may publish a Skill independently of any Campaign; the display address @{handle}/{slug} is derived presentation from the publisher's CURRENT handle — renaming a handle changes the display address but never the Skill's identity or any reference (durable references use ids). First-party TfP Skills use the same mechanism, published by a first-party publisher account (e.g. @tfp). Campaigns curate/recommend Skills; they do not own a separate kind of Skill. Organization publishing is deferred. The current/default version is derived: the highest version_number whose yanked_at is null. Agent Skills package metadata lives on each SkillVersion.",
  "x-tfp-version": "0.2.0",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "slug",
    "publisher_user_id",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^skl_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "Stable opaque identifier — the durable identity every reference uses. Canonical URL: /skills/{id}.",
      "examples": [
        "skl_01jf95aa1lean"
      ]
    },
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
      "maxLength": 64,
      "x-mutable": true,
      "description": "URL-safe short name, unique WITHIN the publisher's Skills (publisher_user_id + slug), not globally. Appears in the derived display address @{handle}/{slug} and pretty URLs; never a durable reference.",
      "examples": [
        "lean-mathlib-proving"
      ]
    },
    "publisher_user_id": {
      "type": "string",
      "pattern": "^usr_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "The User who publishes/maintains this Skill on TfP (registrant). Ownership and the derived namespace hang off this stable id. Publishing is distinct from authorship: an imported Skill's underlying content may be authored upstream by someone else — see SkillVersion source provenance.",
      "examples": [
        "usr_01jf8xw3tempo"
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": false,
      "description": "RFC 3339 UTC timestamp of creation.",
      "examples": [
        "2026-09-01T10:00:00Z"
      ]
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": true,
      "description": "RFC 3339 UTC timestamp of the most recent change to any mutable field.",
      "examples": [
        "2026-09-01T10:00:00Z"
      ]
    }
  }
}