{"module":"curriculum","surface":"alpha","status":"ok","canonicalPathPrefix":"/curriculum/alpha/implementation/api","pathFormat":"Root-absolute paths. Call them from the deployment origin exactly as printed, including /curriculum/alpha/implementation/api.","docs":{"architecture":"https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture","dataDictionary":"https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/data_dictionary","customerWebsite":"https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/customer_website","upstreamCaseDataDictionary":"https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/data_dictionary","content":"https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/customer_website","results":"https://platform3-andymontgomery-9773s-projects.vercel.app/results/alpha/customer_website"},"modelGate":{"authoritativeStorage":["case.cf_document","case.cf_item","case.cf_association","alpha.standards_source_release","alpha.standards_source_row_binding","alpha.knowledge_component","alpha.knowledge_component_version","alpha.kc_prerequisite","alpha.kc_relation","alpha.standard_kc_map"],"migrationEvidenceStorage":["alpha.kc_case_migration_snapshot","alpha.kc_source_identity","alpha.kc_case_migration_ledger","retained CASE source rows"],"standardsStorage":"Frozen framework releases and standards live in CASE; immutable source-release evidence lives in alpha.standards_source_release.","crosswalkStorage":"KC-to-standard mappings live only in alpha.standard_kc_map and are pinned to source_release_id plus the exact alpha.standards_source_row_binding; they are never CASE associations.","kcGraphStorage":"Only alpha.kc_prerequisite is the prerequisite DAG. Other typed, non-prerequisite semantics live in alpha.kc_relation. KCs have no containment tree.","alphaCurriculumBaseTables":"forbidden","alphaCurriculumViews":"Derived read conveniences are never a second authority."},"quickstart":{"mintDemoToken":"POST /curriculum/alpha/implementation/api/dev/mint?tenantId=demo","createComponent":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components","readComponent":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/88888888-8888-4888-8888-888888888880","updateComponent":"PATCH /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/88888888-8888-4888-8888-888888888880","repointComponentTarget":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}/repoint","retireComponent":"DELETE /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb0","createKnowledgeComponent":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs","readKnowledgeComponent":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}","createKcPrerequisite":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites","listKcPrerequisites":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites?kcId={kcId}","listStandardKcMaps":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/standard-kc-maps?source_release_id={sourceReleaseId}","retireKnowledgeComponent":"DELETE /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/dddddddd-dddd-4ddd-8ddd-ddddddddddd0","createAssociation":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/associations","listAssociations":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/associations?componentId=77777777-7777-4777-8777-777777777770","listComponents":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components?kind=lesson&limit=10","readTree":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/66666666-6666-4666-8666-666666666660/tree","readCourseTree":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/66666666-6666-4666-8666-666666666660/tree","readGate":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb0","readGateNextForm":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb0/next-form?studentId=student_demo","approveCourse":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","listCourseApprovals":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","importStandardsFramework":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/standards-frameworks/import","sourceIngest":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/ingest/timeback-course-refs"},"quickstartGuidance":{"lessonContentTarget":{"prerequisite":"Before POSTing examples.authorTrackCourseLesson.createLesson, resolve a published, unretired exact Content version whose release-eligibility read succeeds in the same tenant (owner ruling #2534: any non-failed trust state serves).","eligibilityRead":"GET /content/alpha/implementation/api/tenants/{tenantId}/alpha/content/items/{contentId}/versions/{contentVersionId}/release-eligibility?producer_surface={producerSurface}","returnedFields":["content_id","content_version_id","content_kind","usage_scope","trust_status","serveable","release_eligible","problem_code"],"compatibilityQueryRule":"producer_surface remains a validated compatibility query input only. It is not returned and does not select a release-eligibility lane.","substitutionRule":"Replace <replace with eligible same-tenant Content UUID> and <replace with eligible exact Content version UUID> with the exact eligible response ids and preserve content_kind exactly. Neither placeholder is a runtime UUID, so the createLesson template is not directly POSTable until both are substituted."},"masteryGatePublication":{"lifecycle":"Every newly authored mastery_gate must explicitly declare publication_status. Author as draft while its launch contract is incomplete. Ordinary identities cannot launch draft gates; one complete exact-bank draft may launch only through Content's demo-only governed test-serve authorization.","prerequisite":"Before publishing, require one immutable Content test_bank version's same-tenant release-eligibility read to return the exact governed eight-field response with matching identity, non-failed trust_status (owner ruling #2534), serveable=true, release_eligible=true, and problem_code=null. producer_surface remains query-only compatibility and is not echoed. Curriculum never chooses latest_version_id or writes producer evidence.","readForEtag":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{gateId}","publish":"PATCH /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{gateId}","requiredHeaders":["Authorization","Content-Type: application/json","Idempotency-Key","X-Curriculum-If-Match"],"patchBody":{"publication_status":"published","target_ref":{"module":"content","content_kind":"test_bank","content_id":"<replace with eligible same-tenant Content UUID>","content_version_id":"<replace with eligible exact Content version UUID>"},"renderer_ref":"renderer:qti-test"},"verification":"Require GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/{gateId}/next-form?studentId={probeStudentId} to return 200 with an exact selected_form_ref, or curriculum:bank_exhausted (409) for a student that consumed every eligible form."},"courseApproval":{"integratorPolicy":"An app integrator may approve its course directly. The call does not require a per-course owner ruling when the tenant-scoped caller already has curriculum:write.","endpoint":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","authorization":"Platform-issued tenant-scoped Bearer JWT with curriculum:write","requiredHeaders":["Authorization","Content-Type: application/json","Idempotency-Key"],"requestBody":{"approved_by":"integrator:ap-one","provenance":{"source":"ap-one:course-approval","course_ref":"{integratorCourseRef}"},"expected_course_graph_sha256":"{optionalReviewedGraphSha256}","expected_kc_snapshot_sha256":"{optionalReviewedKcSnapshotSha256}"},"preconditions":"The course root is published, the current graph is complete, and every referenced governed KC is active, published, and has an exact current version. Correction workflows send both optional expected SHA-256 fields so the locked transaction rejects a graph or current-KC race before writing. Content trust is proved separately before publishing each exact gate target.","approvalReadback":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","launchReadback":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/next-lesson","successContract":"Require the POST/GET approval to contain a complete exact KC-version snapshot, then require next-lesson to echo the current approval and firm snapshot. Any changed, draft, retired, incomplete, or unapproved graph fails closed.","turnaround":"The authorized approval transaction is synchronous. Credential provisioning, if needed, is separate Platform tenant onboarding; the repository defines no credential-provisioning SLA and there is no per-course approval queue."},"producerRepointAttach":{"integratorPolicy":"A producer whose course already pins a Content identity repoints that pin to its amended exact version directly with its Platform-issued tenant-scoped credential; a re-pin ticket is not the steady-state path. Attaching newly published content to an unpinned component uses the same endpoint with operation=attach.","endpoint":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}/repoint","authorization":"Platform-issued tenant-scoped Bearer JWT with curriculum:write","requiredHeaders":["Authorization","Content-Type: application/json","Idempotency-Key"],"requestBody":{"operation":"repoint","expected_target_ref":{"module":"content","content_kind":"article","content_id":"<replace with eligible same-tenant Content UUID>","content_version_id":"{currentlyPinnedVersionId}"},"target_ref":{"module":"content","content_kind":"article","content_id":"<replace with eligible same-tenant Content UUID>","content_version_id":"<replace with eligible exact Content version UUID>"}},"integrityChecks":"Server-side, fail closed: expected_target_ref must equal the exact current pin (409 curriculum:repoint_pin_stale), a repoint keeps content_id and content_kind (409 curriculum:repoint_identity_mismatch — an amended revision under a new identity is attached, never silently substituted), the exact new version must pass Content-owned release eligibility with practice_eligible usage scope (409 curriculum:repoint_target_not_serveable), and a published component pinning an assessment chain is frozen to the reviewed-replacement manifest path (409 curriculum:approved_chain_repoint_frozen). Every accepted operation appends one immutable alpha.component_target_repoint_audit row.","afterRepoint":"The repoint changes the course graph, so routing fails closed until the producer appends a new immutable approval with POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals; then require GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/next-lesson to echo the new approval and serve the exact repointed version."}},"newCourseIngestContract":{"provisionOrder":["Import the standards release with POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/standards-frameworks/import and use framework.standards_framework_id in the course standards_framework_refs.","An authorized Curriculum owner creates or resolves a governed identity with POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs using stored_as=alpha.knowledge_component, definition, and optional provenance-only source_kc_id. Capture the returned owner-issued UUID kc_id, verify it with GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}, and use that exact active tenant-owned registry UUID in every downstream reference. Source ids are never lookup or reference aliases.","Write prerequisite ordering through POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites using only registry UUID endpoints; read the governed DAG through GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites. Store other typed graph semantics in alpha.kc_relation and standards links in alpha.standard_kc_map; never encode KC containment.","Append semantic corrections through POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}/versions, record the exact-version outcome through POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-review-decisions, then read the KC ETag and PATCH /curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId} publication_status=published. Identity publication never firms the version.","Author the track/course/lesson tree with POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components.","Import Content through POST /content/alpha/implementation/api/tenants/{tenantId}/alpha/content/imports/qti-package, retain its exact immutable content_id plus content_version_id, and require Content's governed exact-version release-eligibility response to report matching identity, non-failed trust, serveable=true, and release_eligible=true before Curriculum write.","For one primary lesson object, read the lesson ETag, then PATCH /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{lessonId} with alpha.target_ref plus alpha.renderer_ref. Do not repeat this PATCH for a many-item lesson because each call replaces the one direct target.","For multiple questions or other Content items in one lesson, use the deployed CASE compatibility adapter: create one targeted child practice/review component per item through POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components with parent_component_id={lessonId}, a stable unique component_id and sibling position, the lesson KC in alpha.scope_kc_refs, and that item's alpha.target_ref plus alpha.renderer_ref.","Discover every current lesson Content target from GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{lessonId}/tree or GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components?parentId={lessonId}. The accepted target model migrates these one-for-one to course_component_member rows when /courses/{courseId}/members is deployed.","Author every mastery_gate with an explicit publication_status. Keep it draft until an immutable Content test_bank version returns the governed trust-based exact-version eligibility response; then read its ETag and PATCH /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{gateId} publication_status=published together with that exact target_ref and renderer:qti-test. A complete exact-bank draft may be exercised only by Content's enumerated demo test identity and returns a Content authorization receipt without changing lifecycle/trust. Verify /gates/{gateId}/next-form before listing the course as ready.","Approve the complete published graph through POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals and require the returned exact KC-version snapshot; then require GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/next-lesson to echo that approval and the lesson's firm snapshot."],"standardsRule":"Standards framework import creates a frozen standards release identity; it never mints Knowledge Components.","kcCrosswalkRule":"kc_id is the sole active registry identity. Optional source_kc_id is creation provenance and retained migration evidence only: it cannot read, version, retire, scope, remediate, or otherwise stand in for kc_id. Registry-native authoring rejects CASE fields and Curriculum component scope/remediation uses exact active tenant-owned kc_id values only.","clusteringRule":"The producer or learning scientist owns KC clustering grain. A lesson may carry many KCs, and every lesson, unit, practice, or review preserves the non-empty authored scope_kc_refs array; Platform3 does not collapse a multi-KC lesson to one KC or synthesize one-KC-per-lesson structure.","membershipRule":"Lesson-to-Content membership is Curriculum-owned and has one ordered use per Content target. The accepted target is one alpha.course_component_member row per use. Until that member route is deployed, the CASE-backed compatibility adapter represents every additional item as one targeted child practice/review component under the lesson; repeatedly PATCHing the lesson alpha.target_ref would overwrite the prior direct target. Content /kc-tags is independent weighted item-to-governed-KC attribution and never lesson membership.","archiveRule":"GET Content items?curriculum_node_id remains frozen content_curriculum_link archive compatibility and is not new-course discovery. Existing archive rows have no automatic TTL and remain readable until a separately approved migration issue proves dependent consumers have cut over.","deployedCompatibility":{"write":"POST /curriculum/alpha/implementation/api/alpha/curriculum/v1/components","onePlacementPerRequest":true,"parentField":"parent_component_id={lessonId}","allowedPlacementKinds":["practice","review"],"requiredAlphaFields":["scope_kc_refs","target_ref","renderer_ref"],"discovery":["GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{lessonId}/tree","GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/components?parentId={lessonId}"],"warning":"This is the deployed CASE compatibility adapter, not a claim that alpha.course_component_member or /courses/{courseId}/members is live. Each compatibility child migrates to one ordered member; do not create a parallel member store."}},"examples":{"authorTrackCourseLesson":{"headers":{"Authorization":"Bearer <token from POST /curriculum/alpha/implementation/api/dev/mint?tenantId=demo>","Idempotency-Key":"choose a stable retry key per write","Content-Type":"application/json"},"createTrack":{"kind":"track","component_id":"track-api-root-example","document_id":"22222222-2222-4222-8222-222222222220","name":"API Root Example Math Track","human_coding_scheme":"EXAMPLE.MATH","alpha":{"subject_id":"math","engine_ref":"engine:powerpath","entry_policy_ref":"alpha.policy.placement.powerpath_bottom_up_grade_gate","exit_policy_ref":"alpha.policy.completion.powerpath_grade_plan_complete_and_gate_mastered","publication_status":"draft","standards_framework_refs":["11111111-1111-4111-8111-111111111110"]}},"createCourse":{"kind":"course","component_id":"course-api-root-example","document_id":"22222222-2222-4222-8222-222222222220","parent_component_id":"track-api-root-example","position":1,"name":"API Root Example Course","human_coding_scheme":"EXAMPLE.MATH.COURSE","alpha":{"subject_id":"math","audience":"shared","course_kind":"static","course_grade_mode":"single_grade","course_grade_levels":[3],"expected_xp":3505,"publication_status":"draft","standards_framework_refs":["11111111-1111-4111-8111-111111111110"]}},"createMultiGradeCourse":{"kind":"course","component_id":"course-api-root-multigrade-example","document_id":"22222222-2222-4222-8222-222222222220","parent_component_id":"track-api-root-example","position":2,"name":"API Root Example Shared Grade 7-8 Course","human_coding_scheme":"EXAMPLE.LANGUAGE.G07-G08","alpha":{"subject_id":"language","audience":"shared","course_kind":"static","course_grade_mode":"multi_grade","course_grade_levels":[7,8],"expected_xp":1477,"publication_status":"draft","standards_framework_refs":["11111111-1111-4111-8111-111111111110"]}},"createLesson":{"kind":"lesson","component_id":"lesson-api-root-example","document_id":"22222222-2222-4222-8222-222222222220","parent_component_id":"course-api-root-example","position":1,"name":"API Root Example Lesson","human_coding_scheme":"EXAMPLE.MATH.LESSON","alpha":{"scope_kc_refs":["49371a30-9796-4bbd-a523-bd38a876e415"],"expected_xp":12,"target_ref":{"module":"content","content_kind":"interactive","content_id":"<replace with eligible same-tenant Content UUID>","content_version_id":"<replace with eligible exact Content version UUID>"},"renderer_ref":"renderer:interactive-lesson","renderer_kind":"renderer:interactive-lesson","publication_status":"draft"}},"createKnowledgeComponent":{"kc_id":"49371a30-9796-4bbd-a523-bd38a876e415","stored_as":"alpha.knowledge_component","definition":"Represent multiplication facts using equal-size arrays.","alpha":{"subject_id":"math","kc_kind":"substantive","positive_examples":["Build 4 rows of 6."],"negative_examples":["Count objects without equal groups."],"boundary_statement":"Does not include division remainders.","misconceptions":["Swaps groups and group size."],"instructional_classification":{"knowledgeType":"procedure"},"provenance":{"source":"curriculum-api-root-example"},"confidence":0.94,"author_ref":"person:math-owner"}}},"ingestTimeBackCourseRefs":{"source_system":"timeback","producer_batch_id":"api-root-example-course-structure","records":[{"source_table":"courses","sourced_id":"tb-api-root-example-course","title":"API Root Example Imported Course","subject":"Mathematics","grades":["3"],"total_xp":1200},{"source_table":"course_components","sourced_id":"tb-api-root-example-unit","course_sourced_id":"tb-api-root-example-course","sort_order":1,"title":"API Root Example Source Container"},{"source_table":"component_resources","sourced_id":"tb-api-root-example-membership","course_id":"tb-api-root-example-course","course_component_sourced_id":"tb-api-root-example-unit","resource_sourced_id":"tb-api-root-example-resource","component_kind":"lesson","position":1,"title":"API Root Example Ordered Resource Membership","scope_kc_refs":["dddddddd-dddd-4ddd-8ddd-ddddddddddd0"],"expected_xp":12,"content_id":"58612cab-9c46-426c-8c20-0e9f19c807c5","content_version_id":"efcf3561-3a66-4825-9588-e792ef20c312","content_kind":"question"}]}},"endpoints":[{"id":"endpoint-root","method":"GET","path":"/curriculum/alpha/implementation/api","summary":"Read the Curriculum Alpha discovery descriptor.","auth":"public","response":"service_descriptor"},{"id":"endpoint-mint-demo-token","method":"POST","path":"/curriculum/alpha/implementation/api/dev/mint?tenantId=demo","summary":"Mint a public demo JWT for the demo tenant only.","auth":"public demo only","response":"demo_token"},{"id":"endpoint-create-component","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components","summary":"Create a stock CASE component, or reactivate the same caller-supplied soft-retired identity as draft with an advanced version and active ETag; Content targets must pin and pass exact-version release eligibility.","auth":"curriculum:write","response":"curriculum_component"},{"id":"endpoint-read-component","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}","summary":"Read one CASE-backed Curriculum component by id for correction workflows.","auth":"curriculum:read","response":"curriculum_component"},{"id":"endpoint-update-component","method":"PATCH","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}","summary":"Update mutable component fields with X-Curriculum-If-Match, or atomically reparent through an isolated parent_component_id + position patch that preserves component/edge identity and non-containment references; Content targets must remain exact-version release-eligible.","auth":"curriculum:write","response":"curriculum_component","requiredHeaders":["X-Curriculum-If-Match","Idempotency-Key"]},{"id":"endpoint-repoint-component","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}/repoint","summary":"Producer self-service repoint/attach of one component's exact Content pin: compare-and-set on the current pinned target, same-identity discipline for repoints, server-side exact-version release eligibility, one immutable audit row, and a typed freeze that routes approved assessment chains to the reviewed-replacement manifest path.","auth":"curriculum:write","response":"component_target_repoint","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-retire-component","method":"DELETE","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}","summary":"Soft-retire an authored Curriculum component after atomically retiring its incident CASE associations; ordinary list and tree reads exclude it.","auth":"curriculum:write","response":"curriculum_component","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-create-kc","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs","summary":"Create one governed Knowledge Component identity and immutable version in alpha.knowledge_component*, record optional producer source_kc_id provenance without creating an active alias, and reject legacy CASE KC writes.","auth":"curriculum:write","response":"knowledge_component"},{"id":"endpoint-list-kcs","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs","summary":"Discover the active governed KC corpus: a stable cursor list of registry Knowledge Components with their current immutable versions, filterable by subject_id, kc_kind, publication_status, and updated_since. Adaptive-diagnostics consumers read KCs here, never from CASE.","auth":"curriculum:read","response":"page<knowledge_component>"},{"id":"endpoint-read-kc","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}","summary":"Read one governed registry Knowledge Component and its current immutable version by exact owner-issued UUID.","auth":"curriculum:read","response":"knowledge_component"},{"id":"endpoint-create-kc-version","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}/versions","summary":"Append a new immutable draft semantic version and advance only the KC identity current_version_id pointer.","auth":"curriculum:write","response":"knowledge_component_version","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-list-kc-versions","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}/versions","summary":"List every immutable semantic version in version-number order.","auth":"curriculum:read","response":"page<knowledge_component_version>"},{"id":"endpoint-read-kc-version","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}/versions/{versionId}","summary":"Read one exact immutable KC semantic version.","auth":"curriculum:read","response":"knowledge_component_version"},{"id":"endpoint-update-kc","method":"PATCH","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}","summary":"Publish a draft KC identity using ETag/If-Match; publication never changes draft KC-version status.","auth":"curriculum:write","response":"knowledge_component","requiredHeaders":["If-Match","Idempotency-Key"]},{"id":"endpoint-create-kc-review-decision","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-review-decisions","summary":"Append one immutable structured review decision for an exact KC version.","auth":"curriculum:write","response":"kc_review_decision","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-list-kc-review-decisions","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-review-decisions","summary":"List immutable KC review decisions, optionally filtered by exact version.","auth":"curriculum:read","response":"page<kc_review_decision>"},{"id":"endpoint-create-kc-firming-event","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-firming-events","summary":"Record the first-genuine-response backstop and firm its exact draft version; course-approval events can only be created by course approval.","auth":"curriculum:write","response":"kc_firming_event","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-list-kc-firming-events","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-firming-events","summary":"List immutable KC firming evidence, optionally filtered by exact version.","auth":"curriculum:read","response":"page<kc_firming_event>"},{"id":"endpoint-create-course-approval","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","summary":"Atomically approve the current course graph, optionally require exact reviewed graph and KC-snapshot SHA-256 premises, snapshot every exact referenced KC version, create firming evidence, and firm drafts.","auth":"curriculum:write","response":"course_approval","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-list-course-approvals","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/approvals","summary":"List immutable course approvals with their complete exact KC-version snapshots.","auth":"curriculum:read","response":"page<course_approval>"},{"id":"endpoint-create-kc-prerequisite","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites","summary":"Create one governed acyclic prerequisite edge between active registry KC UUIDs.","auth":"curriculum:write","response":"kc_prerequisite","requiredHeaders":["Idempotency-Key"]},{"id":"endpoint-list-kc-prerequisites","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kc-prerequisites","summary":"List governed prerequisite edges by prerequisite, dependent, or either KC endpoint.","auth":"curriculum:read","response":"page<kc_prerequisite>","filters":["kcId","prerequisiteKcId","dependentKcId","updated_since","limit","cursor"]},{"id":"endpoint-retire-kc","method":"DELETE","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/kcs/{kcId}","summary":"Soft-retire the exact canonical registry UUID only when no active prerequisite, relation, standards-map, component-scope, or remediation reference remains.","auth":"curriculum:write","response":"knowledge_component","requiredHeaders":["If-Match","Idempotency-Key"]},{"id":"endpoint-create-association","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/associations","summary":"Create a stock CASE association for initial component containment or framework alignment; isChildOf rejects a component that already has an active parent and directs reparenting to component PATCH, while KC prerequisites, typed relations, and standards maps use their first-class alpha stores.","auth":"curriculum:write","response":"curriculum_association"},{"id":"endpoint-list-associations","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/associations","summary":"List stock CASE associations by type, endpoint, component, or updated_since for correction workflows.","auth":"curriculum:read","response":"page<curriculum_association>","filters":["associationType","originId","destinationId","componentId","updated_since","limit","cursor","sort","order"]},{"id":"endpoint-read-association","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/associations/{associationId}","summary":"Read one stock CASE association by id, including its sequence_number.","auth":"curriculum:read","response":"curriculum_association"},{"id":"endpoint-update-association","method":"PATCH","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/associations/{associationId}","summary":"Update an association sequence_number with X-Curriculum-If-Match for sibling reordering.","auth":"curriculum:write","response":"curriculum_association","requiredHeaders":["X-Curriculum-If-Match","Idempotency-Key"]},{"id":"endpoint-list-standards-frameworks","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/standards-frameworks","summary":"List frozen standards frameworks imported as CASE CFDocuments.","auth":"curriculum:read","response":"page<standards_framework>","filters":["frameworkId","subjectId","updated_since","limit","cursor","sort","order"]},{"id":"endpoint-list-standard-kc-maps","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/standard-kc-maps","summary":"Read active release-pinned standard-to-KC crosswalks with exact governed fields and tenant isolation.","auth":"curriculum:read","response":"page<standard_kc_map>","filters":["source_release_id","standard_id","kc_id","relationship","updated_since","limit","cursor"]},{"id":"endpoint-import-standards-framework","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/standards-frameworks/import","summary":"Import or reuse an immutable checksum-addressed standards release, persist release-scoped CASE framework/standard rows, and write release-pinned KC crosswalks to alpha.standard_kc_map.","auth":"curriculum:import","response":"standards_import_job"},{"id":"endpoint-list-components","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components","summary":"List component-tree CFItems by typed filters, including exact learner-owned personalized course discovery.","auth":"curriculum:read","response":"page<curriculum_component>","filters":["kind","parentId","courseId","sourceCourseRef","studentId","subjectId","publicationStatus","updated_since","limit","cursor","sort","order"],"queryParameters":{"studentId":{"description":"Exact non-empty learner id. Returns only personalized course roots whose stored student_id matches; shared roots and other learners are excluded.","schema":{"type":"string","minLength":1}}}},{"id":"endpoint-renderer-registry","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/renderer-registry","summary":"List renderer routes that Curriculum members may reference, with separate evidence-backed rendering status.","auth":"curriculum:read","response":"renderer_registry"},{"id":"endpoint-read-component-tree","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/components/{componentId}/tree","summary":"Walk a component subtree using stock CASE isChildOf containment; /courses/{courseId}/tree is a compatibility alias for course roots.","auth":"curriculum:read","response":"component_tree","filters":["includeRetired"],"aliases":["/curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/tree"]},{"id":"endpoint-next-lesson","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/courses/{courseId}/next-lesson","summary":"Return the first ordered shared or exact learner-owned personalized lesson/review/practice/gate only when its ancestry, approval, KC snapshot, and exact Content version remain launch-safe.","auth":"curriculum:read","response":"next_lesson","filters":["studentId","subjectId","asOfDate"],"queryParameters":{"studentId":{"description":"Exact learner id, required for a personalized course root. Missing or different ids return the same curriculum:not_found response as an unknown course before Content eligibility; shared courses retain existing behavior.","schema":{"type":"string"}}}},{"id":"endpoint-placement-candidates","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/tracks/{trackId}/placement-candidates","summary":"List grade-level mastery gates Policy/Results use to run bottom-up placement.","auth":"curriculum:read","response":"placement_candidates","filters":["studentId","subjectId","asOfDate"]},{"id":"endpoint-read-gate","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/{componentId}","summary":"Read the Curriculum-owned gate contract without scores, thresholds, or Content body.","auth":"curriculum:read","response":"gate_contract"},{"id":"endpoint-read-gate-status","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/{componentId}/status","summary":"Read the typed Results-backed gate status reference for a student.","auth":"curriculum:read","response":"gate_status","filters":["studentId","resultRecordId","asOfDate"]},{"id":"endpoint-read-gate-next-form","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/{componentId}/next-form","summary":"Choose the deterministic next unseen form after independently revalidating the exact Content test_bank and exact member versions.","auth":"curriculum:read","response":"gate_next_form","filters":["studentId","asOfDate"],"requiredFilters":["studentId"]},{"id":"endpoint-read-gate-remediation","method":"GET","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/gates/{componentId}/remediation","summary":"Resolve the universal gate-failure remediation map: never_learned to lesson, forgot to review, careless to practice.","auth":"curriculum:read","response":"gate_remediation","filters":["studentId","resultRecordId","asOfDate"]},{"id":"endpoint-ingest-timeback-course-refs","method":"POST","path":"/curriculum/alpha/implementation/api/alpha/curriculum/v1/ingest/timeback-course-refs","summary":"Require exact release-eligible Content versions before writing, reject parent replacement or second-parent creation in favor of atomic component PATCH, then assemble source-shaped TimeBack course rows as drafts, verify exact readback, and publish bottom-up with the course root last.","auth":"curriculum:import","response":"source_ingest_job"}],"behaviorContracts":["Grade-level positions are closed to PreK=-1, K=0, and 1..12.","Curriculum enrolled-grade and course routing fields use numeric alpha.grade_level and alpha.course_grade_levels values.","Course grade mode is explicit: single_grade requires exactly one course_grade_levels value; multi_grade requires two or more and is not a first-single-grade anchor.","CASE-style grade_id values such as grade_3 are standards metadata only; consumers must not use them as the cross-surface grade filter enum.","A Curriculum mastery_gate targets a public Content test_bank. Content/QTI may store assessment_role='bank', but Curriculum target_ref never accepts assessment_role and never encodes a bank as content_kind='test'.","Every Content target pins content_id, content_version_id, and content_kind. Curriculum calls Content's exact-version release-eligibility operation at write and again at launch; it never substitutes latest_version_id or stores Content eligibility evidence.","Gate retry form selection revalidates the exact test_bank version and every candidate form version, requires exact parent-version membership plus both practice_eligible usage scopes, and returns only an eligible unseen form.","Renderer is a registered platform Applications capability. Course authors currently set alpha.renderer_ref on the CASE-backed component; after verified cutover the member owns renderer_ref. renderer_kind remains a compatibility alias and resolves to the same registry row.","Gate fields stay on the Curriculum member. Renderer implementations stay outside platform3 and learner progress returns through Events/Results as Caliper evidence.","TimeBack lesson structure enters through /ingest/timeback-course-refs from courses -> course_components -> component_resources -> resources: Curriculum preserves source order and the producer-authored non-empty KC cluster, while Content normalizes the resource; Platform3 does not impose one-KC-per-lesson grain.","Course assembly stages deterministic course/component identities as draft, verifies the complete intended tree, publishes descendants bottom-up, and publishes the course root last; a same-run retry reuses those identities without duplicates.","Direct component authoring preserves caller-supplied deterministic identities across soft retirement: POST reactivates the same retired CASE identity only as draft, advances its version, and returns an immediately readable ETag instead of a normalization-only 201.","An active exact isChildOf child/parent pair is the current containment projection: after parent recreation it supersedes retired same-pair edge history for tree, routing, and publication validation without deleting the historical tombstone.","next-lesson chooses the first ordered lesson/review/practice/mastery-gate frontier before publication filtering, then requires that candidate, every containment ancestor, and the course root to be published. Draft, retired, or missing status fails closed and never exposes a later node.","A course-reference-only, source-empty, or KC-unscoped import is a valid catalog/enrollment anchor but is not routable: next-lesson returns curriculum:lesson_structure_missing until the source supplies an ordered, scoped lesson, review, practice, or mastery-gate descendant.","Every authored or imported target_ref is shape-validated before I/O, then checked through Content's exact-version release-eligibility operation with the same tenant identity. Missing, unavailable, retired, revoked, wrong-bar, malformed, and mismatched targets fail closed.","Every authored or imported target_ref is an exact {content_id, content_version_id, content_kind} tuple. Curriculum asks Content's authoritative release-eligibility endpoint before persistence; missing, malformed, mismatched, unpublished, untrusted, unreleased, revoked, timed-out, and unavailable answers fail closed without partial state.","Next-lesson and gate next-form launch revalidate the persisted exact version instead of substituting latest. Routine routing additionally requires Content usage_scope=practice_eligible, so a version revoked or re-scoped after authoring is blocked at launch.","Gate next-form validates the exact test_bank first, reads membership only for that bank version, then independently validates each exact form version within a bounded 50-member contract. Version mismatch, all-ineligible forms, and genuinely exhausted seen forms remain distinct typed outcomes.","Every mastery_gate explicitly declares publication_status. Ordinary identities cannot select forms from draft gates. One complete exact-bank draft may use Content's demo-only governed test-serve lane after live test/synthetic identity validation and exact authorization audit; publishing remains an ETag-protected component update carrying the release-eligible immutable test_bank target and renderer.","Every scope_kc_refs and remediation_entries.kc_ref value is validated against an active tenant-owned alpha.knowledge_component identity before Curriculum persists anything. Authored multi-KC lesson scope is preserved without imposing clustering grain; source ids, standards codes, and retired or cross-tenant UUIDs never become platform KC references.","Registry-native POST /kcs is owner-only materialization; the returned kc_id is the sole active identity used by GET/version/retire/component and graph operations. Optional source_kc_id is provenance and immutable migration evidence, never a lookup or reference fallback.","GET /standard-kc-maps reads active tenant-owned alpha.standard_kc_map rows with release, standard, KC, relationship, updated_since, and opaque cursor filters; it never exposes tenant_id, legacy match_type, retired_at, or unowned columns.","POST /kcs accepts stored_as=alpha.knowledge_component as an explicit governed-store assertion when definition is present and document_id is absent; other stored_as values, missing definitions, and CASE document ids fail closed instead of silently selecting a different store.","Registry-native KCs do not accept or return name: identity owns kc_id/lineage/kind/subject/publication/current-version, immutable versions own semantic meaning, and display labels belong to course or Content projections.","source_kc_id is provenance only and never create-or-resolve authority. Creation retries use the original Idempotency-Key or exact canonical kc_id; reusing source_kc_id with another or server-minted kc_id fails without partial identity or version rows even when semantics match.","Semantic edits append immutable versions; identity publication uses ETag/If-Match and never firms a version. Review decisions, course approvals with complete exact snapshots, and firming events are separate immutable writes.","Course next-lesson routing requires the current published course graph to have a complete approval snapshot whose exact KC versions are firm and whose KC identities remain active and published.","Personalized course discovery uses GET /components?kind=course&studentId={exactLearnerId}; the exact learner filter returns only course roots carrying that student_id. Personalized next-lesson requires the same exact learner id before Content eligibility and revalidates the persisted owner after asynchronous Content work; missing and different ids are indistinguishable from an unknown course. Shared-course routing remains unchanged.","Many-item lessons use one ordered Content use per item. The accepted target is alpha.course_component_member; while the deployed CASE adapter remains active, authors create one targeted child practice/review component per item and discover all targets from the lesson tree or parent-filtered component list. Repeatedly patching the lesson target is a destructive replacement, not append.","C3_FRAMEWORK Social Studies imports are source-only: the framework must carry bundle, snapshot, and checksum refs, and every standard row must carry bundle, checksum, and source-row evidence refs. Missing evidence is rejected instead of materializing synthetic standards.","Authored component trees are not append-only: clients read one component or association, send X-Curriculum-If-Match (or direct-runtime If-Match) plus Idempotency-Key, and PATCH the CASE-backed row or association sequence_number.","DELETE /components/{componentId} is a composite soft retire for authored debris: in one transaction it retires every incident CASE association before setting the component's first-class retired_at timestamp and publication_status='retired'; it does not cascade-retire neighboring components, and ordinary component, tree, and list reads exclude retired components unless a tree read explicitly asks includeRetired=true.","DELETE /kcs/{kcId} accepts only the exact canonical UUID and soft-retires the governed registry KC only when no active prerequisite, relation, standards-map, component-scope, or remediation reference remains. Source crosswalk and CASE rows stay immutable migration evidence but never resolve active operations."],"gradeLevelContract":{"numericPositions":[-1,0,1,2,3,4,5,6,7,8,9,10,11,12],"enrolledGradeFields":["alpha.grade_level","alpha.course_grade_levels"],"courseGradeModes":["single_grade","multi_grade"],"courseGradeModeRules":{"single_grade":"exactly one course_grade_levels value; eligible as first-single-grade enrollment evidence","multi_grade":"two or more course_grade_levels values; valid course routing metadata but never a first-single-grade anchor"},"standardsMetadataField":"extensions.alpha.grade_ids","standardsGradeIds":["pre_k","k","grade_1","grade_2","grade_3","grade_4","grade_5","grade_6","grade_7","grade_8","grade_9","grade_10","grade_11","grade_12","postsecondary"],"contentCatalogGradeIds":["pre_k","k","1","2","3","4","5","6","7","8","9","10","11","12"],"numericPositionByAlphaGradeId":{"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"10":10,"11":11,"12":12,"pre_k":-1,"k":0}},"rendererRegistry":{"owner":"platform Applications capability registry","endpoint":"GET /curriculum/alpha/implementation/api/alpha/curriculum/v1/renderer-registry","canonicalMemberField":"alpha.renderer_ref","compatibilityAlias":"alpha.renderer_kind","rows":[{"id":"renderer:interactive-lesson","renderer_ref":"renderer:interactive-lesson","aliases":["renderer:article","renderer:interactive"],"name":"Instructional content renderer","owner_module":"applications","lifecycle_state":"active","lifecycle_scope":"routing_registration_only","registered_for_routing":true,"accepted_content_kinds":["article","video","interactive"],"verified_rendering":true,"rendering_state":"verified_partial","verified_scope":"CONTENT_LOAD html bodies, governed article type=html blocks through the centralized sanitizer, plus typed interactive_article segment and interactive_video cue compositions with inline-QTI checkpoints","rendering_note":"Issue #2501 verifies governed article HTML blocks against the pinned player and centralized sanitizer; issue #1593 verifies the good/broken composition pairs. Checkpoint QTI coverage inherits the 8/21 verified item interactions, so consult the capability matrix for exact scope.","integration_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player","versioned_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/versions/2026-08-07.issue-2699-article-images/","player_version":"2026-08-07.issue-2699-article-images","capability_matrix_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/renderer-capabilities.json","integration_protocol":"iframe_postmessage","playground_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player?demo=1","implementation_ref":"platform3:first-party-reference-player:/site/player","markup_contract_ref":"content.alpha.tb_markup_contract","content_load_fields":["html","qtiXml","contentId","contentRef","interactiveComposition","contentState","config"],"progress_contract":"The renderer reports transient CONTENT_STATE_CHANGE for host UI state; durable learner progress flows back as Caliper events through Events/Results, never as a renderer or host private progress store."},{"id":"renderer:qti-item","renderer_ref":"renderer:qti-item","aliases":["renderer:question"],"name":"QTI item renderer","owner_module":"applications","lifecycle_state":"active","lifecycle_scope":"routing_registration_only","registered_for_routing":true,"accepted_content_kinds":["question"],"verified_rendering":true,"rendering_state":"verified_partial","verified_scope":"8/21 QTI item interaction types, including the bounded graphicGapMatch text-label/rect-target subset; strict public Content handoffs after canonical QTI and assessment-component distractors","rendering_note":"Issue #1678 verifies the strict choice-object fallback. Issue #2511 verifies the exact student-safe graphicGapMatch handoff, authenticated first-party graph media, text-label/rect-target renderer, directedPair response array, and loud rejection of malformed payloads.","integration_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player","versioned_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/versions/2026-08-07.issue-2699-article-images/","player_version":"2026-08-07.issue-2699-article-images","capability_matrix_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/renderer-capabilities.json","integration_protocol":"iframe_postmessage","playground_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player?demo=1","implementation_ref":"platform3:first-party-reference-player:/site/player","markup_contract_ref":"content.alpha.qti","content_load_fields":["qtiXml","html","contentId","contentRef","contentState","config"],"progress_contract":"QTI XML and scoring semantics stay QTI-owned; learner outcomes flow through Results/Events."},{"id":"renderer:qti-test","renderer_ref":"renderer:qti-test","aliases":["renderer:test","renderer:test_bank"],"name":"QTI test and bank renderer","owner_module":"applications","lifecycle_state":"active","lifecycle_scope":"routing_registration_only","registered_for_routing":true,"accepted_content_kinds":["test","test_bank"],"verified_rendering":true,"rendering_state":"verified_partial","verified_scope":"Exact-version test forms whose ordered questions use the 8/21 verified item interactions; test_bank launches delegate deterministic selection to this module's next-form operation and render only its exact selected_form_ref.","rendering_note":"Issue #1922 verifies the native test/test_bank adapter with a pinned good/broken form fixture pair. A test_bank CONTENT_LOAD requires gateComponentId and studentId; the player calls Curriculum next-form, verifies the returned exact bank identity, then reads and renders the selected exact Content form. Unsupported question interactions still fail visibly.","integration_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player","versioned_endpoint":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/versions/2026-08-07.issue-2699-article-images/","player_version":"2026-08-07.issue-2699-article-images","capability_matrix_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player/renderer-capabilities.json","integration_protocol":"iframe_postmessage","playground_url":"https://platform3-andymontgomery-9773s-projects.vercel.app/player?demo=1","implementation_ref":"platform3:first-party-reference-player:/site/player","markup_contract_ref":"content.alpha.qti","content_load_fields":["contentRef","gateComponentId","studentId","contentState","config"],"progress_contract":"QTI XML and scoring semantics stay QTI-owned; gate fields stay on the Curriculum member and learner outcomes flow through Results/Events."}]},"allowedValues":{"component_kind":["track","grade","course","unit","module","chapter","section","topic","lesson","practice","review","quiz","test","mastery_gate","remediation_pocket","placeholder"],"cf_item_type_alpha":["track","grade","course","unit","module","chapter","section","topic","lesson","practice","review","quiz","test","mastery_gate","remediation_pocket","placeholder","publisher standard item types"],"knowledge_component_stored_as_assertion":["alpha.knowledge_component"],"kc_review_decision":["accept-as-new","map-to-existing","edit","split","merge","reject/relocate","defer"],"kc_firming_reason":["course_approval","first_genuine_response"],"association_type_alpha":["isChildOf","precedes","isPartOf","exactMatchOf","isRelatedTo","replacedBy","isTranslationOf"],"standard_kc_relationship":["exact","broader","narrower","supports"],"gate_remediation_reason":["never_learned","forgot","careless"],"subject_id":["math","reading","language","science","computer_science","vocabulary","writing","social_studies"],"course_grade_mode":["single_grade","multi_grade"],"grade_level":[-1,0,1,2,3,4,5,6,7,8,9,10,11,12],"course_grade_levels":[-1,0,1,2,3,4,5,6,7,8,9,10,11,12],"alpha_grade_id":["pre_k","k","1","2","3","4","5","6","7","8","9","10","11","12"],"alpha_grade_id_to_numeric_position":{"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"10":10,"11":11,"12":12,"pre_k":-1,"k":0},"standards_grade_id":["pre_k","k","grade_1","grade_2","grade_3","grade_4","grade_5","grade_6","grade_7","grade_8","grade_9","grade_10","grade_11","grade_12","postsecondary"],"expected_xp_calibration":["migrated_production","speed_run","authoring_estimate"],"publication_status":["draft","published","retired"],"alpha_component_field":["subject_id","grade_level","course_grade_mode","course_grade_levels","expected_xp","audience","student_id","course_kind","engine_ref","entry_policy_ref","exit_policy_ref","publication_status","standards_framework_refs","scope_kc_refs","target_ref","renderer_ref","renderer_kind","passing_criteria_ref","on_fail","failed_gate_ref","remediation_entries","placeholder_reason","replacement_criteria","source_refs"],"content_kind":["question","test","test_spec","test_bank","article","video","audio","image","interactive","media_asset","external_link","script"],"renderer_ref":["renderer:interactive-lesson","renderer:qti-item","renderer:qti-test"],"renderer_kind":["renderer:interactive-lesson","renderer:qti-item","renderer:qti-test"],"grade_id":["pre_k","k","grade_1","grade_2","grade_3","grade_4","grade_5","grade_6","grade_7","grade_8","grade_9","grade_10","grade_11","grade_12","postsecondary"],"curriculum_scopes":["curriculum:read","curriculum:write","curriculum:import","curriculum:admin"]},"responseShapes":{"list":"Collection routes return {data, hasMore, nextCursor, links}.","component":"Component writes/read rows are serialized from case.cf_item and report stored_as='case.cf_item'. Singular component reads fail closed when storage has multiple active parents. An isolated parent_component_id + position PATCH atomically updates its one active containment edge while preserving component/edge identity and every non-containment reference; zero/multiple parents, cycles, cross-tenant parents, and occupied sibling positions fail closed.","componentRetirement":"Component retirement atomically tombstones incident CASE associations before the CFItem: DELETE returns the retired component with retired_at and publication_status='retired'; GET/list/tree reads exclude it by default.","componentReactivation":"POST /components with a caller-supplied soft-retired component_id transactionally reactivates that same CASE identity as draft, preserves its original created_at, increments version, clears retired_at, and returns the active row ETag; a supplied same-id retired containment edge is reactivated in the same transaction. If surviving active children are reattached through new edge ids, each active exact child/parent pair supersedes retired same-pair history for current tree, routing, and publication validation.","knowledgeComponent":"Knowledge Component creates and exact-UUID reads return the governed alpha.knowledge_component identity plus immutable current version with stored_as='alpha.knowledge_component'. Optional source_kc_id is provenance only and never resolves an active operation.","knowledgeComponentRetirement":"Knowledge Component retirement accepts only the canonical UUID and soft-retires the governed registry row after active graph, standards-map, component-scope, and remediation blocker checks; source crosswalk and CASE rows remain immutable evidence.","standardKcMap":{"fields":["map_id","source_release_id","standard_binding_id","standard_id","kc_id","relationship","confidence","provenance","created_at","updated_at"],"provenance":"A non-empty JSON object. Pre-JSONB legacy strings read back losslessly as {legacy: exactStoredString}."},"association":"Association writes/read/update rows serialize from case.cf_association and report stored_as='case.cf_association'; PATCH changes sequence_number for sibling reordering. POST isChildOf may place only an unparented component and rejects a second active parent; reparenting belongs exclusively to component PATCH. A newly active exact child/parent pair refreshes current containment after parent recreation while its retired predecessor remains audit history.","tree":"Tree reads return {root_component_id, components, derived_measures}; sibling order comes from CASE sequence_number. In tree responses, container expected_xp is serialized as the expected-XP-bearing leaf subtotal for that subtree, so authored aggregate values never double-count with children.","gate":"Gate reads return a target_ref to a public Content test_bank, renderer_ref, compatibility renderer_kind, passing_criteria_ref, and on_fail; no scores, thresholds, or Content body.","gateNextForm":"Gate next-form reads return the selected Content test form from the gate's referenced test_bank, plus the bank ref, selection policy, and source refs.","ingest":"Source-shaped TimeBack course and ordered component records normalize server-side into deterministic draft CASE rows, receive exact tree readback, publish bottom-up with the course root last, and never return HTTP 200 for validation Problems. Ingest may replay initial placement but cannot change or add a second active parent; use atomic component PATCH. Course refs alone remain draft and do not synthesize lesson structure."},"modulePlacement":{"belongsHereIf":"Part of the shared map of what there is to learn, or a shared path/container/sequence through it.","excluded":["questions, stimuli, tests, articles, media, and external links as Content bodies","per-student mastery, attempts, scores, XP, next task, and track position","threshold numbers, reward amounts, retake rules, and retention models","students, teachers, schools, classes, and enrollments","stored Common Cartridge bundles"]}}