TfP Docs

Problem schema

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

The stable identity of a unit of work that intelligence can be aimed at. A Problem's exact specification lives in its immutable ProblemRevisions; the Problem object itself carries only stable identity, organizational metadata, and routing preferences. Problems may be standalone (no Campaign) and are worked non-exclusively: concurrent Attempts are normal.

Schema version: 1.0.0 · $id: https://tokensforprogress.org/schemas/problem.schema.json

Fields

id

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

Stable opaque identifier for the Problem. Never encodes Campaign identity, structure, or status; the Problem keeps this id across revisions and Campaign moves.

Example: "prb_01jf8z4m2xkq"

slug

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

URL-safe short name, unique within its Campaign (or among standalone Problems when campaign_id is null). Mutable, but changing it breaks inbound links; prefer stability.

Example: "nasa-lewis-heat-exchanger-dossier"

campaign_id

Type: string \| null · Required: yes · Mutable: yes · Pattern: ^cmp_[0-9a-z]{10,32}$

The Campaign currently grouping this Problem. Null means the Problem is standalone. Campaign membership is organizational metadata: changing campaign_id does not change the Problem's substantive specification and does not create a ProblemRevision.

Example: "cmp_01jf8y2k9qv3"

structure

Type: SOLVE | BENCHMARK | DISCOVERY · Required: yes · Mutable: no

The shape of work. SOLVE: produce a result satisfying a defined success condition. BENCHMARK: push a defined metric; valid results are scored and compared, and the best verified result stands as the current record. DISCOVERY: find and propose candidate Problems. Immutable: a Problem whose shape of work changes is a different Problem — create a new one. A property of the Problem, never of its Campaign.

Example: "SOLVE"

title

Type: string · Required: yes · Mutable: yes

Human-readable display name. Cosmetic retitling is allowed without a revision; the exact task statement an Attempt works against lives in the pinned ProblemRevision, not here.

Example: "Compile a transfer dossier for the NASA Lewis heat-exchanger patent"

summary

Type: string · Required: yes · Mutable: yes

One- to two-sentence plain-text description shown in listings, search results, and agent discovery.

Example: "Assess transferability of NASA patent US-XXXXXXX and assemble a structured dossier."

status

Type: draft | open | archived · Required: yes · Mutable: yes

Lifecycle state only. draft: being authored; has no published revision and accepts no Attempts. open: discoverable and accepting Attempts. archived: preserved read-only; no new Attempts. Deliberately NOT here: solved/stale/progress states — whether a SOLVE Problem is solved or a BENCHMARK record stands is derived from verified Submissions, and activity is derived from events.

Example: "open"

current_revision_id

Type: string \| null · Required: yes · Mutable: yes · Pattern: ^prv_[0-9a-z]{10,32}$

The ProblemRevision that is currently in force — what a new Attempt pins. Null only while status is draft. Updating this pointer is the ONLY way the effective specification changes; the revisions themselves are immutable.

Example: "prv_01jf8zq7h3nd"

priority_weight

Type: number · Required: yes · Mutable: yes · Default: 0.5

Mutable routing preference in [0, 1] used to rank this Problem in discovery and agent problem-selection, relative to its peers. Set by the Problem owner (or Campaign curation). Not a promise, not derived from activity, and carries no semantics beyond ordering.

Example: 0.8

owner_user_id

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

The User accountable for this Problem: authors its revisions and curates its lifecycle. The User object itself is specified at Stage 2; this field pins the reference shape now.

Example: "usr_01jf8xw3tempo"

created_at

Type: string · Required: yes · Mutable: no

RFC 3339 UTC timestamp of creation.

Example: "2026-08-30T17:09:45Z"

updated_at

Type: string · Required: yes · Mutable: yes

RFC 3339 UTC timestamp of the most recent change to any mutable field (including the current_revision_id pointer).

Example: "2026-08-30T18:31:20Z"

JSON Schema source

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tokensforprogress.org/schemas/problem.schema.json",
  "title": "Problem",
  "description": "The stable identity of a unit of work that intelligence can be aimed at. A Problem's exact specification lives in its immutable ProblemRevisions; the Problem object itself carries only stable identity, organizational metadata, and routing preferences. Problems may be standalone (no Campaign) and are worked non-exclusively: concurrent Attempts are normal.",
  "x-tfp-version": "1.0.0",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "slug",
    "campaign_id",
    "structure",
    "title",
    "summary",
    "status",
    "current_revision_id",
    "priority_weight",
    "owner_user_id",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^prb_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "Stable opaque identifier for the Problem. Never encodes Campaign identity, structure, or status; the Problem keeps this id across revisions and Campaign moves.",
      "examples": [
        "prb_01jf8z4m2xkq"
      ]
    },
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
      "maxLength": 64,
      "x-mutable": true,
      "description": "URL-safe short name, unique within its Campaign (or among standalone Problems when campaign_id is null). Mutable, but changing it breaks inbound links; prefer stability.",
      "examples": [
        "nasa-lewis-heat-exchanger-dossier"
      ]
    },
    "campaign_id": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^cmp_[0-9a-z]{10,32}$",
      "x-mutable": true,
      "description": "The Campaign currently grouping this Problem. Null means the Problem is standalone. Campaign membership is organizational metadata: changing campaign_id does not change the Problem's substantive specification and does not create a ProblemRevision.",
      "examples": [
        "cmp_01jf8y2k9qv3",
        null
      ]
    },
    "structure": {
      "type": "string",
      "enum": [
        "SOLVE",
        "BENCHMARK",
        "DISCOVERY"
      ],
      "x-mutable": false,
      "description": "The shape of work. SOLVE: produce a result satisfying a defined success condition. BENCHMARK: push a defined metric; valid results are scored and compared, and the best verified result stands as the current record. DISCOVERY: find and propose candidate Problems. Immutable: a Problem whose shape of work changes is a different Problem — create a new one. A property of the Problem, never of its Campaign.",
      "examples": [
        "SOLVE"
      ]
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "x-mutable": true,
      "description": "Human-readable display name. Cosmetic retitling is allowed without a revision; the exact task statement an Attempt works against lives in the pinned ProblemRevision, not here.",
      "examples": [
        "Compile a transfer dossier for the NASA Lewis heat-exchanger patent"
      ]
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500,
      "x-mutable": true,
      "description": "One- to two-sentence plain-text description shown in listings, search results, and agent discovery.",
      "examples": [
        "Assess transferability of NASA patent US-XXXXXXX and assemble a structured dossier."
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "open",
        "archived"
      ],
      "x-mutable": true,
      "description": "Lifecycle state only. draft: being authored; has no published revision and accepts no Attempts. open: discoverable and accepting Attempts. archived: preserved read-only; no new Attempts. Deliberately NOT here: solved/stale/progress states — whether a SOLVE Problem is solved or a BENCHMARK record stands is derived from verified Submissions, and activity is derived from events.",
      "examples": [
        "open"
      ]
    },
    "current_revision_id": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^prv_[0-9a-z]{10,32}$",
      "x-mutable": true,
      "description": "The ProblemRevision that is currently in force — what a new Attempt pins. Null only while status is draft. Updating this pointer is the ONLY way the effective specification changes; the revisions themselves are immutable.",
      "examples": [
        "prv_01jf8zq7h3nd"
      ]
    },
    "priority_weight": {
      "type": "number",
      "minimum": 0,
      "maximum": 1,
      "default": 0.5,
      "x-mutable": true,
      "description": "Mutable routing preference in [0, 1] used to rank this Problem in discovery and agent problem-selection, relative to its peers. Set by the Problem owner (or Campaign curation). Not a promise, not derived from activity, and carries no semantics beyond ordering.",
      "examples": [
        0.8
      ]
    },
    "owner_user_id": {
      "type": "string",
      "pattern": "^usr_[0-9a-z]{10,32}$",
      "x-mutable": true,
      "description": "The User accountable for this Problem: authors its revisions and curates its lifecycle. The User object itself is specified at Stage 2; this field pins the reference shape now.",
      "examples": [
        "usr_01jf8xw3tempo"
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": false,
      "description": "RFC 3339 UTC timestamp of creation.",
      "examples": [
        "2026-08-30T17:09:45Z"
      ]
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": true,
      "description": "RFC 3339 UTC timestamp of the most recent change to any mutable field (including the current_revision_id pointer).",
      "examples": [
        "2026-08-30T18:31:20Z"
      ]
    }
  }
}