{
  "openapi": "3.1.0",
  "info": {
    "title": "Curriculum (Alpha)",
    "description": "The Alpha Curriculum API maps CASE competency frameworks into course components, knowledge components, standards, frameworks, and associations. It owns curriculum policy configuration and reward rules, import receipts, and graph/gate command reads.",
    "version": "1.0"
  },
  "tags": [
    {
      "name": "Course Component",
      "description": "Headline delivery-structure projection of case:cfItem, joined 1:1 to the owned courseComponentExtension companion for the curriculum-only fields (multi-base grammar; presence optional — every extension field is column-nullable, so a bare CFItem stays visible). One recursive component shape with per-kind mandatory fields."
    },
    {
      "name": "Curriculum Association",
      "description": "Graph edge projection of case:cfAssociation. originId/destinationId are synthesized in the view from the CASE LinkURI jsonb endpoints, so associations created on ANY surface (CASE import, TimeBack write, Alpha) always read with real endpoints (UAT-2 M1)."
    },
    {
      "name": "Curriculum Policy",
      "description": "Sole-owned alpha.policy.* configuration rows. Effective-dated by policyKey for reproducible as-of reads of thresholds like the 89.5 mastery cutoff."
    },
    {
      "name": "Import Batch",
      "description": "Receipt entity for curriculum import/ingest commands. Status is plain CRUD GET. import_kind=cf_package is the Alpha CFPackage import door; CASE keeps official /ims/case/v1p1 import and receipt GETs."
    },
    {
      "name": "Knowledge Component",
      "description": "Mastery grain projection of case:cfItem, joined 1:1 to the owned knowledgeComponentExtension companion for the KC-only fields (multi-base grammar; presence optional — every extension field is column-nullable, so a bare CFItem stays visible)."
    },
    {
      "name": "Reward Rule",
      "description": "Reward/incentive policy rows. Curriculum sole-creates; consumers import read-only."
    },
    {
      "name": "Standard",
      "description": "Plain-language standard projection of case:cfItem, joined 1:1 to the owned standardExtension companion for frameworkId and subject (multi-base grammar; presence optional — both fields are column-nullable, so a bare CFItem stays visible; wire requiredness is API-enforced)."
    },
    {
      "name": "Standards Framework",
      "description": "Frozen standards framework projection of case:cfDocument, joined 1:1 to the owned standardsFrameworkExtension companion carrying documentType (multi-base grammar; presence optional — a CFDocument created on the CASE surface has no companion row yet and classifies once adopted by a curriculum write)."
    }
  ],
  "paths": {
    "/curriculum/v1/course-component": {
      "get": {
        "operationId": "listCourseComponents",
        "summary": "List course components",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Filter by componentKind.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "componentKind",
              "operator": "eq"
            }
          },
          {
            "name": "parentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "x-filter": {
              "column": "parentComponentId",
              "operator": "eq"
            }
          },
          {
            "name": "subjectId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "publicationStatus",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "draft",
                "published",
                "retired"
              ]
            },
            "x-filter": {
              "column": "publicationStatus",
              "operator": "eq"
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "x-filter": {
              "column": "updatedAt",
              "operator": "gte"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CourseComponent"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createCourseComponent",
        "summary": "Create a course component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Course Component"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCourseComponentRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/{componentId}": {
      "get": {
        "operationId": "getCourseComponent",
        "summary": "Get a course component",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateCourseComponent",
        "summary": "Update a course component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCourseComponentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "412": {
            "description": "Problem (curriculum:precondition_failed).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "428": {
            "description": "Problem (curriculum:precondition_required).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteCourseComponent",
        "summary": "Retire a course component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No Content.",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deleted"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/{componentId}/tree": {
      "get": {
        "operationId": "getComponentTree",
        "summary": "Recursive component tree",
        "description": "Computed isChildOf descent.\n\n> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "componentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "componentKind": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "children": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "componentId",
                    "children"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/tracks/{trackId}/placement-candidates": {
      "get": {
        "operationId": "getPlacementCandidates",
        "summary": "Placement gate candidates for a track",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "trackId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "candidates": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "entryPolicyRef": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "candidates",
                    "entryPolicyRef"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/courses/{courseId}/next-lesson": {
      "get": {
        "operationId": "getNextLesson",
        "summary": "Next deliverable lesson",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "courseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "courseId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "componentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "componentKind": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "reason": {
                      "type": "string",
                      "enum": [
                        "frontier_ready"
                      ]
                    },
                    "scopeKcRefs": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid"
                      }
                    },
                    "targetRef": {
                      "type": "object"
                    },
                    "rendererRef": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "courseId",
                    "componentId",
                    "componentKind",
                    "reason",
                    "scopeKcRefs"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/gates/{componentId}": {
      "get": {
        "operationId": "getGate",
        "summary": "Gate contract detail",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gateComponentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "componentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "mastery_gate"
                      ]
                    },
                    "targetRef": {
                      "type": "object"
                    },
                    "rendererRef": {
                      "type": "string"
                    },
                    "passingCriteriaRef": {
                      "type": "string"
                    },
                    "onFail": {
                      "type": "string"
                    },
                    "scopeKcRefs": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid"
                      }
                    },
                    "storedAs": {
                      "type": "string",
                      "enum": [
                        "case.cf_item+curriculum.course_component_extension"
                      ]
                    }
                  },
                  "required": [
                    "gateComponentId",
                    "componentId",
                    "kind",
                    "targetRef",
                    "passingCriteriaRef",
                    "onFail",
                    "scopeKcRefs",
                    "storedAs"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/gates/{componentId}/status": {
      "get": {
        "operationId": "getGateStatus",
        "summary": "Gate status",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gateComponentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "gateStatus": {
                      "type": "string",
                      "enum": [
                        "configured",
                        "draft",
                        "retired"
                      ]
                    },
                    "configurationComplete": {
                      "type": "boolean"
                    },
                    "sourceStateRefs": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "gateComponentId",
                    "gateStatus",
                    "configurationComplete",
                    "sourceStateRefs"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/gates/{componentId}/next-form": {
      "get": {
        "operationId": "getGateNextForm",
        "summary": "Deterministic lowest unseen form",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gateComponentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "studentId": {
                      "type": "string"
                    },
                    "testBankRef": {
                      "type": "object"
                    },
                    "selectedFormRef": {
                      "type": "object"
                    },
                    "selectionPolicy": {
                      "type": "string",
                      "enum": [
                        "lowest_unseen_form_index"
                      ]
                    },
                    "formIndex": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "seenFormRefs": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "contentOwner": {
                      "type": "string"
                    },
                    "resultsOwner": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "gateComponentId",
                    "studentId",
                    "testBankRef",
                    "selectedFormRef",
                    "selectionPolicy",
                    "formIndex",
                    "seenFormRefs",
                    "contentOwner",
                    "resultsOwner"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Problem (curriculum:bank_exhausted).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/course-component/gates/{componentId}/remediation": {
      "get": {
        "operationId": "getGateRemediation",
        "summary": "Gate remediation entries",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Course Component"
        ],
        "parameters": [
          {
            "name": "componentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "gateComponentId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "entries": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "resultsOwner": {
                      "type": "string"
                    },
                    "sourceStateRefs": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "gateComponentId",
                    "entries",
                    "resultsOwner",
                    "sourceStateRefs"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/curriculum-association": {
      "get": {
        "operationId": "listCurriculumAssociations",
        "summary": "List curriculum associations",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Curriculum Association"
        ],
        "parameters": [
          {
            "name": "associationType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "isChildOf",
                "precedes",
                "isPartOf",
                "exactMatchOf",
                "isRelatedTo",
                "replacedBy",
                "isTranslationOf"
              ]
            },
            "x-filter": {
              "column": "associationType",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CurriculumAssociation"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/curriculum-association/{identifier}": {
      "get": {
        "operationId": "getCurriculumAssociation",
        "summary": "Get a curriculum association",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Curriculum Association"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurriculumAssociation"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/curriculum-policy": {
      "get": {
        "operationId": "listCurriculumPolicies",
        "summary": "List curriculum policy rows",
        "description": "Lists alpha.policy.* configuration rows for the tenant. Supports ?asOf= for effective-dated reads.\n\n> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Curriculum Policy"
        ],
        "parameters": [
          {
            "name": "policyKey",
            "in": "query",
            "required": false,
            "description": "Filter by policy key.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "policyKey",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "asOf",
            "in": "query",
            "required": false,
            "description": "Return only rows whose effective period covers this date: effectiveFrom <= asOf and (effectiveTo is null or asOf < effectiveTo). Absent, the full history is returned.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CurriculumPolicy"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createCurriculumPolicy",
        "summary": "Create a curriculum policy period",
        "description": "> **Requires role:** `admin`",
        "tags": [
          "Curriculum Policy"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCurriculumPolicyRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurriculumPolicy"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Problem (curriculum_policy_overlap).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/curriculum-policy/{policyKey}": {
      "get": {
        "operationId": "getCurriculumPolicy",
        "summary": "Get a curriculum policy row",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Curriculum Policy"
        ],
        "parameters": [
          {
            "name": "policyKey",
            "in": "path",
            "required": true,
            "description": "The policy key (URL-encoded).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "asOf",
            "in": "query",
            "required": false,
            "description": "Return only rows whose effective period covers this date: effectiveFrom <= asOf and (effectiveTo is null or asOf < effectiveTo). Absent, the full history is returned.",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurriculumPolicy"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum_policy_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateCurriculumPolicy",
        "summary": "Update a curriculum policy period",
        "description": "> **Requires role:** `admin`",
        "tags": [
          "Curriculum Policy"
        ],
        "parameters": [
          {
            "name": "policyKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCurriculumPolicyRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurriculumPolicy"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum_policy_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Problem (curriculum_policy_overlap).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/import-batch": {
      "get": {
        "operationId": "listImportBatches",
        "summary": "List import batch receipts",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Import Batch"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ImportBatch"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/import-batch/{batchId}": {
      "get": {
        "operationId": "getImportBatch",
        "summary": "Get import batch receipt",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Import Batch"
        ],
        "parameters": [
          {
            "name": "batchId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (import_batch_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/import-batch/ingest/{sourceAdapter}": {
      "post": {
        "operationId": "ingestTimebackCourseRefs",
        "summary": "Ingest course refs via source-generic adapter",
        "description": "Source-generic TimeBack course-ref ingest. Writes importBatch receipt.\n\n> **Requires role:** `admin` · `author`",
        "tags": [
          "Import Batch"
        ],
        "parameters": [
          {
            "name": "sourceAdapter",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "The idempotency key (max 128 chars). REQUIRED — absent returns 428. A completed replay returns the stored response at 200 with idempotency-replayed: true.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "records": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "minItems": 1
                  },
                  "dryRun": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "records"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK (idempotent replay — the stored first response; idempotency-replayed: true).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict — an operation with this Idempotency-Key is already in progress (60s lock).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Problem (curriculum:adapter_rejected).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "428": {
            "description": "Precondition Required — this operation requires the Idempotency-Key header.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/import-batch/standards-framework": {
      "post": {
        "operationId": "importStandardsFramework",
        "summary": "Import standards framework (Alpha-shaped)",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Import Batch"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "The idempotency key (max 128 chars). REQUIRED — absent returns 428. A completed replay returns the stored response at 200 with idempotency-replayed: true.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "framework": {
                    "type": "object"
                  },
                  "standards": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "minItems": 1
                  },
                  "associations": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "description": "Optional explicit CASE graph edges in addition to parent references carried by standards."
                  },
                  "sourceSystem": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128,
                    "default": "curriculum-alpha"
                  },
                  "dryRun": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "framework",
                  "standards"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK (idempotent replay — the stored first response; idempotency-replayed: true).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict — an operation with this Idempotency-Key is already in progress (60s lock).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Problem (curriculum:adapter_rejected).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "428": {
            "description": "Precondition Required — this operation requires the Idempotency-Key header.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/import-batch/cf-package": {
      "post": {
        "operationId": "importCfPackage",
        "summary": "Import CFPackage (Alpha-shaped)",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Import Batch"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "The idempotency key (max 128 chars). REQUIRED — absent returns 428. A completed replay returns the stored response at 200 with idempotency-replayed: true.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "package": {
                    "type": "object"
                  },
                  "sourceSystem": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128,
                    "default": "case-package"
                  },
                  "dryRun": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "package"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK (idempotent replay — the stored first response; idempotency-replayed: true).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatch"
                }
              }
            },
            "headers": {
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict — an operation with this Idempotency-Key is already in progress (60s lock).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Problem (curriculum:adapter_rejected).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "428": {
            "description": "Precondition Required — this operation requires the Idempotency-Key header.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/knowledge-component": {
      "get": {
        "operationId": "listKnowledgeComponents",
        "summary": "List knowledge components",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Knowledge Component"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/KnowledgeComponent"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createKnowledgeComponent",
        "summary": "Create a knowledge component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Knowledge Component"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateKnowledgeComponentRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/knowledge-component/{kcId}": {
      "get": {
        "operationId": "getKnowledgeComponent",
        "summary": "Get a knowledge component",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Knowledge Component"
        ],
        "parameters": [
          {
            "name": "kcId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateKnowledgeComponent",
        "summary": "Update a knowledge component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Knowledge Component"
        ],
        "parameters": [
          {
            "name": "kcId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateKnowledgeComponentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeComponent"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteKnowledgeComponent",
        "summary": "Retire a knowledge component",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Knowledge Component"
        ],
        "parameters": [
          {
            "name": "kcId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No Content.",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deleted"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/knowledge-component/{kcId}/subtree": {
      "get": {
        "operationId": "getKcSubtree",
        "summary": "KC subtree",
        "description": "Recursive KC isChildOf/precedes descent.\n\n> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Knowledge Component"
        ],
        "parameters": [
          {
            "name": "kcId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "kcId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "name": {
                      "type": "string"
                    },
                    "children": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "kcId",
                    "children"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/reward-rule": {
      "get": {
        "operationId": "listRewardRules",
        "summary": "List reward rules",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Reward Rule"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RewardRule"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createRewardRule",
        "summary": "Create a reward rule",
        "description": "> **Requires role:** `admin`",
        "tags": [
          "Reward Rule"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRewardRuleRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RewardRule"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/reward-rule/{rewardRuleKey}": {
      "get": {
        "operationId": "getRewardRule",
        "summary": "Get a reward rule",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Reward Rule"
        ],
        "parameters": [
          {
            "name": "rewardRuleKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RewardRule"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (reward_rule_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateRewardRule",
        "summary": "Update a reward rule",
        "description": "> **Requires role:** `admin`",
        "tags": [
          "Reward Rule"
        ],
        "parameters": [
          {
            "name": "rewardRuleKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRewardRuleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RewardRule"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (reward_rule_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/standard": {
      "get": {
        "operationId": "listStandards",
        "summary": "List standards",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Standard"
        ],
        "parameters": [
          {
            "name": "subject",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            },
            "x-filter": {
              "column": "subject",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Standard"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createStandard",
        "summary": "Create a standard",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Standard"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStandardRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Standard"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/standard/{identifier}": {
      "get": {
        "operationId": "getStandard",
        "summary": "Get a standard",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Standard"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Standard"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateStandard",
        "summary": "Update a standard",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Standard"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStandardRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Standard"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteStandard",
        "summary": "Retire a standard",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Standard"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No Content.",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deleted"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/standards-framework": {
      "get": {
        "operationId": "listStandardsFrameworks",
        "summary": "List standards frameworks",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Standards Framework"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StandardsFramework"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createStandardsFramework",
        "summary": "Create a standards framework",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Standards Framework"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStandardsFrameworkRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardsFramework"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/curriculum/v1/standards-framework/{identifier}": {
      "get": {
        "operationId": "getStandardsFramework",
        "summary": "Get a standards framework",
        "description": "> **Requires role:** `admin` · `author` · `runtime`",
        "tags": [
          "Standards Framework"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardsFramework"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (curriculum:not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "updateStandardsFramework",
        "summary": "Update a standards framework",
        "description": "> **Requires role:** `admin` · `author`",
        "tags": [
          "Standards Framework"
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStandardsFrameworkRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardsFramework"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CourseComponent": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "Stable component id (cfItem PK); wire alias componentId in routes."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "parentComponentId": {
            "type": "string",
            "format": "uuid",
            "description": "Parent component containment edge."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "Component display name."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "Human coding scheme / short code."
          },
          "componentKind": {
            "type": "string",
            "enum": [
              "track",
              "grade",
              "course",
              "unit",
              "module",
              "chapter",
              "section",
              "topic",
              "lesson",
              "practice",
              "review",
              "quiz",
              "test",
              "mastery_gate",
              "remediation_pocket",
              "placeholder"
            ],
            "description": "Governed component_kind vocabulary. Drives row visibility for this projection."
          },
          "curriculumDocumentId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning curriculum/framework document id, set at write/import."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject id."
          },
          "gradeLevel": {
            "type": "integer",
            "minimum": -1,
            "maximum": 12,
            "description": "Typed grade position for grade components."
          },
          "expectedXp": {
            "type": "integer",
            "minimum": 0,
            "description": "Student-independent expected XP on leaves (denominator)."
          },
          "targetRef": {
            "type": "object",
            "properties": {
              "contentId": {
                "type": "string",
                "format": "uuid"
              },
              "contentKind": {
                "type": "string"
              },
              "versionId": {
                "type": "string",
                "format": "uuid"
              },
              "targetRefType": {
                "type": "string"
              }
            },
            "description": "Typed delivery ref to Content (hook-validated).",
            "additionalProperties": false
          },
          "rendererRef": {
            "type": "string",
            "maxLength": 256,
            "description": "FK to applications renderer capability registry."
          },
          "passingCriteriaRef": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.",
            "description": "Reference to curriculumPolicy or content passing rule — never inline cutoff."
          },
          "onFail": {
            "type": "string",
            "enum": [
              "never_learned_lesson",
              "forgot_review",
              "careless_practice"
            ],
            "description": "Remediation behavior on gate failure."
          },
          "gates": {
            "type": "boolean",
            "description": "Whether this component gates progress."
          },
          "scopeKcRefs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "KC identifiers taught/assessed by this component."
          },
          "publicationStatus": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "retired"
            ],
            "description": "Publication lifecycle for delivery components."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "lastChangeDateTime": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "identifier",
          "uri",
          "name",
          "componentKind",
          "publicationStatus",
          "createdAt",
          "lastChangeDateTime"
        ]
      },
      "CourseComponentExtension": {
        "type": "object",
        "properties": {
          "cfItemIdentifier": {
            "type": "string",
            "format": "uuid",
            "description": "Shared natural id with the CASE CFItem this course component extension belongs to 1:1. FK CASCADE so deleting the cfItem reaps the companion.",
            "x-references": "case:cfItem.identifier",
            "x-onDelete": "cascade"
          },
          "componentKind": {
            "type": "string",
            "enum": [
              "track",
              "grade",
              "course",
              "unit",
              "module",
              "chapter",
              "section",
              "topic",
              "lesson",
              "practice",
              "review",
              "quiz",
              "test",
              "mastery_gate",
              "remediation_pocket",
              "placeholder"
            ],
            "description": "Governed component_kind vocabulary. Drives row visibility for this projection."
          },
          "curriculumDocumentId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning curriculum/framework document id, set at write/import."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject id."
          },
          "gradeLevel": {
            "type": "integer",
            "minimum": -1,
            "maximum": 12,
            "description": "Typed grade position for grade components."
          },
          "expectedXp": {
            "type": "integer",
            "minimum": 0,
            "description": "Student-independent expected XP on leaves (denominator)."
          },
          "targetRef": {
            "type": "object",
            "properties": {
              "contentId": {
                "type": "string",
                "format": "uuid"
              },
              "contentKind": {
                "type": "string"
              },
              "versionId": {
                "type": "string",
                "format": "uuid"
              },
              "targetRefType": {
                "type": "string"
              }
            },
            "description": "Typed delivery ref to Content (hook-validated).",
            "additionalProperties": false
          },
          "rendererRef": {
            "type": "string",
            "maxLength": 256,
            "description": "FK to applications renderer capability registry.",
            "x-references": "applications:rendererCapability.rendererRef",
            "x-onDelete": "restrict"
          },
          "passingCriteriaRef": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.",
            "description": "Reference to curriculumPolicy or content passing rule — never inline cutoff.",
            "x-references": "curriculumPolicy.policyKey",
            "x-onDelete": "restrict"
          },
          "onFail": {
            "type": "string",
            "enum": [
              "never_learned_lesson",
              "forgot_review",
              "careless_practice"
            ],
            "description": "Remediation behavior on gate failure."
          },
          "gates": {
            "type": "boolean",
            "description": "Whether this component gates progress."
          },
          "scopeKcRefs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "KC identifiers taught/assessed by this component."
          },
          "publicationStatus": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "retired"
            ],
            "description": "Publication lifecycle for delivery components."
          }
        },
        "required": [
          "cfItemIdentifier"
        ]
      },
      "CurriculumAssociation": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFAssociation identifier. Together with tenantId this is the composite-natural primary key; it is immutable and client supplied by the standards package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "associationType": {
            "type": "string",
            "description": "The CASE association type. requires the governed CASE values plus an `ext:` escape for real cross-framework extension types; this is deliberately not a bare open string.",
            "oneOf": [
              {
                "type": "string",
                "enum": [
                  "isChildOf",
                  "precedes",
                  "isPartOf",
                  "exactMatchOf",
                  "isRelatedTo",
                  "replacedBy",
                  "isTranslationOf"
                ]
              },
              {
                "type": "string",
                "pattern": "^ext:"
              }
            ]
          },
          "originId": {
            "type": "string",
            "format": "uuid",
            "description": "Origin node identifier, read from the CASE originNodeURI LinkURI's required identifier. Computed in the view so every write origin (CASE package import, TimeBack authoring, Alpha) surfaces real endpoints — never a second stored copy (UAT-2 M1).",
            "readOnly": true
          },
          "destinationId": {
            "type": "string",
            "format": "uuid",
            "description": "Destination node identifier, read from the CASE destinationNodeURI LinkURI's required identifier. Computed in the view so every write origin surfaces real endpoints — never a second stored copy (UAT-2 M1).",
            "readOnly": true
          },
          "position": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional CASE sequence number used by publishers when association order has meaning."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "lastChangeDateTime": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "identifier",
          "uri",
          "associationType",
          "createdAt",
          "lastChangeDateTime"
        ]
      },
      "CurriculumPolicy": {
        "type": "object",
        "properties": {
          "policyKey": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.",
            "minLength": 1,
            "maxLength": 255,
            "description": "Namespaced policy key. Immutable once created. Curriculum sole-creates every alpha.policy.* key."
          },
          "value": {
            "type": "object",
            "description": "Policy payload (jsonb). Structure is policy-specific; consumers import read-only.",
            "additionalProperties": true
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Version label for audit and reproducibility."
          },
          "unit": {
            "type": "string",
            "maxLength": 64,
            "description": "Optional unit hint for display/reporting (e.g. percent, attempts, days)."
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date",
            "description": "First day this policy value is in force (inclusive)."
          },
          "effectiveTo": {
            "type": "string",
            "format": "date",
            "description": "Last day this policy value is in force (exclusive). Null means open-ended current period."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "policyKey",
          "value",
          "policyVersion",
          "effectiveFrom",
          "updatedAt"
        ]
      },
      "ImportBatch": {
        "type": "object",
        "properties": {
          "batchId": {
            "type": "string",
            "format": "uuid",
            "description": "Stable batch identifier (composite PK leg with tenantId)."
          },
          "sourceSystem": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Originating system or adapter name."
          },
          "importKind": {
            "type": "string",
            "enum": [
              "standards_framework",
              "cf_package",
              "timeback_course_ref",
              "common_cartridge"
            ],
            "description": "Which import door produced this receipt."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "completed",
              "failed",
              "quarantined"
            ],
            "description": "Processing status."
          },
          "documentCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of cfDocument rows materialized."
          },
          "itemCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of cfItem rows materialized."
          },
          "associationCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of cfAssociation rows materialized."
          },
          "quarantineCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Rows quarantined during import."
          },
          "errors": {
            "type": "object",
            "description": "Structured error payload for failed/quarantined batches.",
            "additionalProperties": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "batchId",
          "sourceSystem",
          "importKind",
          "status",
          "documentCount",
          "itemCount",
          "associationCount",
          "quarantineCount",
          "createdAt",
          "updatedAt"
        ]
      },
      "KnowledgeComponent": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFItem identifier. Together with tenantId this is the composite-natural primary key; it is immutable and client supplied by the standards package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "gradeIds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pre_k",
                "kindergarten",
                "grade_1",
                "grade_2",
                "grade_3",
                "grade_4",
                "grade_5",
                "grade_6",
                "grade_7",
                "grade_8",
                "grade_9",
                "grade_10",
                "grade_11",
                "grade_12"
              ]
            },
            "description": "Grade labels this KC applies to (caitd-014 vocabulary)."
          },
          "kcGranularity": {
            "type": "string",
            "enum": [
              "skill",
              "subskill",
              "standard_cluster"
            ],
            "description": "KC granularity enum (caitd-014). Row visibility for KC projection."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "lastChangeDateTime": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "identifier",
          "uri",
          "name",
          "kcGranularity",
          "createdAt",
          "lastChangeDateTime"
        ]
      },
      "KnowledgeComponentExtension": {
        "type": "object",
        "properties": {
          "cfItemIdentifier": {
            "type": "string",
            "format": "uuid",
            "description": "Shared natural id with the CASE CFItem this knowledge component extension belongs to 1:1. FK CASCADE so deleting the cfItem reaps the companion.",
            "x-references": "case:cfItem.identifier",
            "x-onDelete": "cascade"
          },
          "gradeIds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pre_k",
                "kindergarten",
                "grade_1",
                "grade_2",
                "grade_3",
                "grade_4",
                "grade_5",
                "grade_6",
                "grade_7",
                "grade_8",
                "grade_9",
                "grade_10",
                "grade_11",
                "grade_12"
              ]
            },
            "description": "Grade labels this KC applies to (caitd-014 vocabulary)."
          },
          "kcGranularity": {
            "type": "string",
            "enum": [
              "skill",
              "subskill",
              "standard_cluster"
            ],
            "description": "KC granularity enum (caitd-014). Row visibility for KC projection."
          }
        },
        "required": [
          "cfItemIdentifier"
        ]
      },
      "RewardRule": {
        "type": "object",
        "properties": {
          "rewardRuleKey": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.reward_rules\\.",
            "minLength": 1,
            "maxLength": 255,
            "description": "Stable reward rule identifier within the tenant."
          },
          "triggerKind": {
            "type": "string",
            "enum": [
              "mastery_gate_passed",
              "streak",
              "xp_goal_met",
              "placement_complete"
            ],
            "description": "What event triggers this reward."
          },
          "rewardKind": {
            "type": "string",
            "enum": [
              "xp_bonus",
              "badge",
              "currency"
            ],
            "description": "Kind of reward granted."
          },
          "magnitude": {
            "type": "number",
            "minimum": 0,
            "description": "Reward magnitude (units depend on rewardKind)."
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Policy version label for audit."
          },
          "active": {
            "type": "boolean",
            "description": "Whether this rule is currently active."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "rewardRuleKey",
          "triggerKind",
          "rewardKind",
          "magnitude",
          "policyVersion",
          "active",
          "updatedAt"
        ]
      },
      "Standard": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFItem identifier. Together with tenantId this is the composite-natural primary key; it is immutable and client supplied by the standards package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "statement": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "parentId": {
            "type": "string",
            "format": "uuid",
            "description": "Optional parent CFItem identifier. Null means the item is a root. When present, same-tenant composite self-FK to `cfItem.identifier` with restrict-delete semantics and a recursive acyclic guard so a CFItem cannot become its own ancestor."
          },
          "frameworkId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning standards framework document id."
          },
          "subject": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "lastChangeDateTime": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "identifier",
          "uri",
          "statement",
          "subject",
          "frameworkId",
          "createdAt",
          "lastChangeDateTime"
        ]
      },
      "StandardExtension": {
        "type": "object",
        "properties": {
          "cfItemIdentifier": {
            "type": "string",
            "format": "uuid",
            "description": "Shared natural id with the CASE CFItem this standard extension belongs to 1:1. FK CASCADE so deleting the cfItem reaps the companion.",
            "x-references": "case:cfItem.identifier",
            "x-onDelete": "cascade"
          },
          "frameworkId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning standards framework document id."
          },
          "subject": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject."
          }
        },
        "required": [
          "cfItemIdentifier"
        ]
      },
      "StandardsFramework": {
        "type": "object",
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFDocument identifier. Together with tenantId this is the composite-natural primary key; it is immutable and supplied by the framework package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable title of the framework document."
          },
          "cfPackageUri": {
            "type": "object",
            "properties": {
              "uri": {
                "type": "string",
                "format": "uri",
                "description": "The canonical URI for the anchored CFPackage."
              },
              "identifier": {
                "type": "string",
                "format": "uuid",
                "description": "The CFPackage identifier when the producer supplies it."
              },
              "title": {
                "type": "string",
                "minLength": 1,
                "description": "A human-readable label for the CFPackage."
              },
              "targetType": {
                "type": "string",
                "minLength": 1,
                "description": "The CASE resource type, normally CFPackage."
              }
            },
            "required": [
              "uri"
            ],
            "description": "Required CASE package anchor.",
            "additionalProperties": false
          },
          "versionLabel": {
            "type": "string",
            "minLength": 1,
            "description": "The publisher-defined framework version, independent of the CASE specification version."
          },
          "publisher": {
            "type": "string",
            "minLength": 1,
            "description": "The person, agency, publisher, or organization that created the framework document."
          },
          "documentType": {
            "type": "string",
            "enum": [
              "standards_framework",
              "course_map"
            ],
            "description": "Framework document type. The column DEFAULT classifies documents created on the CASE surface (which cannot name this curriculum-owned extends column) as standards_framework, so the typed/enum contract holds for every write origin (UAT-2 M3).",
            "default": "standards_framework"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed row-creation timestamp (RFC 3339). Read-only — never accepted on create or update."
          },
          "lastChangeDateTime": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "identifier",
          "uri",
          "name",
          "cfPackageUri",
          "documentType",
          "createdAt",
          "lastChangeDateTime"
        ]
      },
      "StandardsFrameworkExtension": {
        "type": "object",
        "properties": {
          "cfDocumentIdentifier": {
            "type": "string",
            "format": "uuid",
            "description": "Shared natural id with the CASE CFDocument this standards framework extension belongs to 1:1. FK CASCADE so deleting the cfDocument reaps the companion.",
            "x-references": "case:cfDocument.identifier",
            "x-onDelete": "cascade"
          },
          "documentType": {
            "type": "string",
            "enum": [
              "standards_framework",
              "course_map"
            ],
            "description": "Framework document type. The column DEFAULT classifies documents created on the CASE surface (which cannot name this curriculum-owned extends column) as standards_framework, so the typed/enum contract holds for every write origin (UAT-2 M3).",
            "default": "standards_framework"
          }
        },
        "required": [
          "cfDocumentIdentifier"
        ]
      },
      "CreateCourseComponentRequest": {
        "type": "object",
        "description": "Create-CourseComponent request body (readOnly/server-managed fields excluded).",
        "required": [
          "identifier",
          "uri",
          "name",
          "componentKind",
          "publicationStatus"
        ],
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "Stable component id (cfItem PK); wire alias componentId in routes."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "parentComponentId": {
            "type": "string",
            "format": "uuid",
            "description": "Parent component containment edge."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "Component display name."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "Human coding scheme / short code."
          },
          "componentKind": {
            "type": "string",
            "enum": [
              "track",
              "grade",
              "course",
              "unit",
              "module",
              "chapter",
              "section",
              "topic",
              "lesson",
              "practice",
              "review",
              "quiz",
              "test",
              "mastery_gate",
              "remediation_pocket",
              "placeholder"
            ],
            "description": "Governed component_kind vocabulary. Drives row visibility for this projection."
          },
          "curriculumDocumentId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning curriculum/framework document id, set at write/import."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject id."
          },
          "gradeLevel": {
            "type": "integer",
            "minimum": -1,
            "maximum": 12,
            "description": "Typed grade position for grade components."
          },
          "expectedXp": {
            "type": "integer",
            "minimum": 0,
            "description": "Student-independent expected XP on leaves (denominator)."
          },
          "targetRef": {
            "type": "object",
            "properties": {
              "contentId": {
                "type": "string",
                "format": "uuid"
              },
              "contentKind": {
                "type": "string"
              },
              "versionId": {
                "type": "string",
                "format": "uuid"
              },
              "targetRefType": {
                "type": "string"
              }
            },
            "description": "Typed delivery ref to Content (hook-validated).",
            "additionalProperties": false
          },
          "rendererRef": {
            "type": "string",
            "maxLength": 256,
            "description": "FK to applications renderer capability registry."
          },
          "passingCriteriaRef": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.",
            "description": "Reference to curriculumPolicy or content passing rule — never inline cutoff."
          },
          "onFail": {
            "type": "string",
            "enum": [
              "never_learned_lesson",
              "forgot_review",
              "careless_practice"
            ],
            "description": "Remediation behavior on gate failure."
          },
          "gates": {
            "type": "boolean",
            "description": "Whether this component gates progress."
          },
          "scopeKcRefs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "KC identifiers taught/assessed by this component."
          },
          "publicationStatus": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "retired"
            ],
            "description": "Publication lifecycle for delivery components."
          }
        }
      },
      "UpdateCourseComponentRequest": {
        "type": "object",
        "description": "Update-CourseComponent request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "parentComponentId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Parent component containment edge."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "Component display name."
          },
          "code": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "description": "Human coding scheme / short code."
          },
          "componentKind": {
            "type": "string",
            "enum": [
              "track",
              "grade",
              "course",
              "unit",
              "module",
              "chapter",
              "section",
              "topic",
              "lesson",
              "practice",
              "review",
              "quiz",
              "test",
              "mastery_gate",
              "remediation_pocket",
              "placeholder"
            ],
            "description": "Governed component_kind vocabulary. Drives row visibility for this projection."
          },
          "curriculumDocumentId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Owning curriculum/framework document id, set at write/import."
          },
          "subjectId": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing",
              null
            ],
            "description": "Canonical subject id."
          },
          "gradeLevel": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": -1,
            "maximum": 12,
            "description": "Typed grade position for grade components."
          },
          "expectedXp": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "description": "Student-independent expected XP on leaves (denominator)."
          },
          "targetRef": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "contentId": {
                "type": "string",
                "format": "uuid"
              },
              "contentKind": {
                "type": "string"
              },
              "versionId": {
                "type": "string",
                "format": "uuid"
              },
              "targetRefType": {
                "type": "string"
              }
            },
            "description": "Typed delivery ref to Content (hook-validated).",
            "additionalProperties": false
          },
          "rendererRef": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256,
            "description": "FK to applications renderer capability registry."
          },
          "passingCriteriaRef": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^alpha\\.policy\\.",
            "description": "Reference to curriculumPolicy or content passing rule — never inline cutoff."
          },
          "onFail": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "never_learned_lesson",
              "forgot_review",
              "careless_practice",
              null
            ],
            "description": "Remediation behavior on gate failure."
          },
          "gates": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether this component gates progress."
          },
          "scopeKcRefs": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "KC identifiers taught/assessed by this component."
          },
          "publicationStatus": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "retired"
            ],
            "description": "Publication lifecycle for delivery components."
          }
        }
      },
      "CreateCurriculumPolicyRequest": {
        "type": "object",
        "description": "Create-CurriculumPolicy request body (readOnly/server-managed fields excluded).",
        "required": [
          "policyKey",
          "value",
          "policyVersion",
          "effectiveFrom"
        ],
        "additionalProperties": false,
        "properties": {
          "policyKey": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.",
            "minLength": 1,
            "maxLength": 255,
            "description": "Namespaced policy key. Immutable once created. Curriculum sole-creates every alpha.policy.* key."
          },
          "value": {
            "type": "object",
            "description": "Policy payload (jsonb). Structure is policy-specific; consumers import read-only.",
            "additionalProperties": true
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Version label for audit and reproducibility."
          },
          "unit": {
            "type": "string",
            "maxLength": 64,
            "description": "Optional unit hint for display/reporting (e.g. percent, attempts, days)."
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date",
            "description": "First day this policy value is in force (inclusive)."
          },
          "effectiveTo": {
            "type": "string",
            "format": "date",
            "description": "Last day this policy value is in force (exclusive). Null means open-ended current period."
          }
        }
      },
      "UpdateCurriculumPolicyRequest": {
        "type": "object",
        "description": "Update-CurriculumPolicy request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "value": {
            "type": "object",
            "description": "Policy payload (jsonb). Structure is policy-specific; consumers import read-only.",
            "additionalProperties": true
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Version label for audit and reproducibility."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64,
            "description": "Optional unit hint for display/reporting (e.g. percent, attempts, days)."
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date",
            "description": "First day this policy value is in force (inclusive)."
          },
          "effectiveTo": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Last day this policy value is in force (exclusive). Null means open-ended current period."
          }
        }
      },
      "CreateKnowledgeComponentRequest": {
        "type": "object",
        "description": "Create-KnowledgeComponent request body (readOnly/server-managed fields excluded).",
        "required": [
          "identifier",
          "uri",
          "name",
          "kcGranularity"
        ],
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFItem identifier. Together with tenantId this is the composite-natural primary key; it is immutable and client supplied by the standards package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "gradeIds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pre_k",
                "kindergarten",
                "grade_1",
                "grade_2",
                "grade_3",
                "grade_4",
                "grade_5",
                "grade_6",
                "grade_7",
                "grade_8",
                "grade_9",
                "grade_10",
                "grade_11",
                "grade_12"
              ]
            },
            "description": "Grade labels this KC applies to (caitd-014 vocabulary)."
          },
          "kcGranularity": {
            "type": "string",
            "enum": [
              "skill",
              "subskill",
              "standard_cluster"
            ],
            "description": "KC granularity enum (caitd-014). Row visibility for KC projection."
          }
        }
      },
      "UpdateKnowledgeComponentRequest": {
        "type": "object",
        "description": "Update-KnowledgeComponent request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "gradeIds": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "enum": [
                "pre_k",
                "kindergarten",
                "grade_1",
                "grade_2",
                "grade_3",
                "grade_4",
                "grade_5",
                "grade_6",
                "grade_7",
                "grade_8",
                "grade_9",
                "grade_10",
                "grade_11",
                "grade_12"
              ]
            },
            "description": "Grade labels this KC applies to (caitd-014 vocabulary)."
          },
          "kcGranularity": {
            "type": "string",
            "enum": [
              "skill",
              "subskill",
              "standard_cluster"
            ],
            "description": "KC granularity enum (caitd-014). Row visibility for KC projection."
          }
        }
      },
      "CreateRewardRuleRequest": {
        "type": "object",
        "description": "Create-RewardRule request body (readOnly/server-managed fields excluded).",
        "required": [
          "rewardRuleKey",
          "triggerKind",
          "rewardKind",
          "magnitude",
          "policyVersion",
          "active"
        ],
        "additionalProperties": false,
        "properties": {
          "rewardRuleKey": {
            "type": "string",
            "pattern": "^alpha\\.policy\\.reward_rules\\.",
            "minLength": 1,
            "maxLength": 255,
            "description": "Stable reward rule identifier within the tenant."
          },
          "triggerKind": {
            "type": "string",
            "enum": [
              "mastery_gate_passed",
              "streak",
              "xp_goal_met",
              "placement_complete"
            ],
            "description": "What event triggers this reward."
          },
          "rewardKind": {
            "type": "string",
            "enum": [
              "xp_bonus",
              "badge",
              "currency"
            ],
            "description": "Kind of reward granted."
          },
          "magnitude": {
            "type": "number",
            "minimum": 0,
            "description": "Reward magnitude (units depend on rewardKind)."
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Policy version label for audit."
          },
          "active": {
            "type": "boolean",
            "description": "Whether this rule is currently active."
          }
        }
      },
      "UpdateRewardRuleRequest": {
        "type": "object",
        "description": "Update-RewardRule request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "triggerKind": {
            "type": "string",
            "enum": [
              "mastery_gate_passed",
              "streak",
              "xp_goal_met",
              "placement_complete"
            ],
            "description": "What event triggers this reward."
          },
          "rewardKind": {
            "type": "string",
            "enum": [
              "xp_bonus",
              "badge",
              "currency"
            ],
            "description": "Kind of reward granted."
          },
          "magnitude": {
            "type": "number",
            "minimum": 0,
            "description": "Reward magnitude (units depend on rewardKind)."
          },
          "policyVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Policy version label for audit."
          },
          "active": {
            "type": "boolean",
            "description": "Whether this rule is currently active."
          }
        }
      },
      "CreateStandardRequest": {
        "type": "object",
        "description": "Create-Standard request body (readOnly/server-managed fields excluded).",
        "required": [
          "identifier",
          "uri",
          "statement",
          "subject",
          "frameworkId"
        ],
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFItem identifier. Together with tenantId this is the composite-natural primary key; it is immutable and client supplied by the standards package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "statement": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "parentId": {
            "type": "string",
            "format": "uuid",
            "description": "Optional parent CFItem identifier. Null means the item is a root. When present, same-tenant composite self-FK to `cfItem.identifier` with restrict-delete semantics and a recursive acyclic guard so a CFItem cannot become its own ancestor."
          },
          "frameworkId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning standards framework document id."
          },
          "subject": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject."
          }
        }
      },
      "UpdateStandardRequest": {
        "type": "object",
        "description": "Update-Standard request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "statement": {
            "type": "string",
            "minLength": 1,
            "description": "The complete competency or standard statement text shown to users and consumers."
          },
          "code": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "description": "The human-readable code for the statement, such as `1.OA.A.1`, when the framework defines one."
          },
          "parentId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Optional parent CFItem identifier. Null means the item is a root. When present, same-tenant composite self-FK to `cfItem.identifier` with restrict-delete semantics and a recursive acyclic guard so a CFItem cannot become its own ancestor."
          },
          "frameworkId": {
            "type": "string",
            "format": "uuid",
            "description": "Owning standards framework document id."
          },
          "subject": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical subject."
          }
        }
      },
      "CreateStandardsFrameworkRequest": {
        "type": "object",
        "description": "Create-StandardsFramework request body (readOnly/server-managed fields excluded).",
        "required": [
          "identifier",
          "uri",
          "name",
          "cfPackageUri",
          "documentType"
        ],
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "type": "string",
            "format": "uuid",
            "description": "The CASE CFDocument identifier. Together with tenantId this is the composite-natural primary key; it is immutable and supplied by the framework package."
          },
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable title of the framework document."
          },
          "cfPackageUri": {
            "type": "object",
            "properties": {
              "uri": {
                "type": "string",
                "format": "uri",
                "description": "The canonical URI for the anchored CFPackage."
              },
              "identifier": {
                "type": "string",
                "format": "uuid",
                "description": "The CFPackage identifier when the producer supplies it."
              },
              "title": {
                "type": "string",
                "minLength": 1,
                "description": "A human-readable label for the CFPackage."
              },
              "targetType": {
                "type": "string",
                "minLength": 1,
                "description": "The CASE resource type, normally CFPackage."
              }
            },
            "required": [
              "uri"
            ],
            "description": "Required CASE package anchor.",
            "additionalProperties": false
          },
          "versionLabel": {
            "type": "string",
            "minLength": 1,
            "description": "The publisher-defined framework version, independent of the CASE specification version."
          },
          "publisher": {
            "type": "string",
            "minLength": 1,
            "description": "The person, agency, publisher, or organization that created the framework document."
          },
          "documentType": {
            "type": "string",
            "enum": [
              "standards_framework",
              "course_map"
            ],
            "description": "Framework document type. The column DEFAULT classifies documents created on the CASE surface (which cannot name this curriculum-owned extends column) as standards_framework, so the typed/enum contract holds for every write origin (UAT-2 M3).",
            "default": "standards_framework"
          }
        }
      },
      "UpdateStandardsFrameworkRequest": {
        "type": "object",
        "description": "Update-StandardsFramework request body (partial — all fields optional; readOnly + immutable fields excluded; null clears a nullable column).",
        "additionalProperties": false,
        "properties": {
          "uri": {
            "type": "string",
            "format": "uri",
            "description": "CASE canonical URI required by master constraints."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "description": "The human-readable title of the framework document."
          },
          "cfPackageUri": {
            "type": "object",
            "properties": {
              "uri": {
                "type": "string",
                "format": "uri",
                "description": "The canonical URI for the anchored CFPackage."
              },
              "identifier": {
                "type": "string",
                "format": "uuid",
                "description": "The CFPackage identifier when the producer supplies it."
              },
              "title": {
                "type": "string",
                "minLength": 1,
                "description": "A human-readable label for the CFPackage."
              },
              "targetType": {
                "type": "string",
                "minLength": 1,
                "description": "The CASE resource type, normally CFPackage."
              }
            },
            "required": [
              "uri"
            ],
            "description": "Required CASE package anchor.",
            "additionalProperties": false
          },
          "versionLabel": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "description": "The publisher-defined framework version, independent of the CASE specification version."
          },
          "publisher": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "description": "The person, agency, publisher, or organization that created the framework document."
          },
          "documentType": {
            "type": "string",
            "enum": [
              "standards_framework",
              "course_map"
            ],
            "description": "Framework document type. The column DEFAULT classifies documents created on the CASE surface (which cannot name this curriculum-owned extends column) as standards_framework, so the typed/enum contract holds for every write origin (UAT-2 M3).",
            "default": "standards_framework"
          }
        }
      },
      "Problem": {
        "type": "object",
        "description": "RFC 7807 problem details.",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "A URI identifying the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence."
          },
          "instance": {
            "type": "string",
            "format": "uri",
            "description": "A URI identifying this occurrence."
          }
        },
        "required": [
          "title",
          "status"
        ]
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "servers": [
    {
      "url": "https://alpha.platform4.alphaschool.dev"
    }
  ]
}
