{
  "schemaVersion": "2.1.0",
  "module": "curriculum",
  "surface": "alpha",
  "deliverable": "data_dictionary",
  "title": "TimeBack Curriculum Alpha Data Dictionary",
  "issue": 1727,
  "canonicalUrl": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/data_dictionary/",
  "architectureUrl": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/",
  "upstreamContracts": [
    {
      "name": "1EdTech CASE 1.1",
      "role": "Verbatim standards/framework transport and source-row shape",
      "href": "https://www.imsglobal.org/spec/CASE/v1p1/"
    },
    {
      "name": "Curriculum Alpha architecture",
      "role": "Every Alpha storage, validation, API, and ownership divergence",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/"
    },
    {
      "name": "Content Alpha data dictionary",
      "role": "Exact-version Content identity and release eligibility",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/data_dictionary/"
    },
    {
      "name": "Platform renderer capability registry",
      "role": "renderer_ref resolution and verified capability evidence",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/player/renderer-capabilities.json"
    },
    {
      "name": "Incept acquisition runbook",
      "role": "Producer source-selection procedure only; never Curriculum storage or rights authority",
      "href": "https://github.com/andymontgomery-byte/incept-skill-pack/blob/main/docs/standards-source-acquisition.md"
    }
  ],
  "semanticRegistryRefs": {
    "authoring_subject_registry": {
      "id": "alpha.policy.authoring_subject_registry.v2026-07-16.issue-771",
      "source": "loop/context/authoring-subject-registry.json"
    }
  },
  "contractState": {
    "authoritativeTarget": "The four-store model in this dictionary is the accepted authority after verified cutover.",
    "deployedCompatibility": "The deployed Curriculum API currently reads CASE-backed components. Component GET fails closed rather than selecting one edge when storage has multiple active parents. POST /components creates initial placement; an isolated PATCH /components/{componentId} with parent_component_id + position atomically replaces the component's one active containment parent while preserving component/edge identity and every non-containment reference. Generic association POST and TimeBack ingest cannot add a second active parent; ingest also cannot replace a parent. A one-object lesson may carry one direct target. A producer-authoritative no-KC lesson is represented only by kind=lesson with an exact eligible target_ref, a compatible registered renderer_ref, scope_kc_refs=[], and kc_scope_decision=authoritative_no_kc; detail, tree, and next-lesson repeat that exact decision, and the lesson contributes no KC-version snapshot or mastery evidence. Missing or unresolved KC scope still fails closed. For a many-item lesson, create one stable ordered child practice/review component per Content item with parent_component_id=lesson, matching KC scope, target_ref, and renderer_ref; discover all targets through the lesson tree or GET /components?parentId=lesson. This is a one-for-one compatibility adapter to future member rows, not authority to add another member store. curriculum.component_sample remains only so deployed conformance probes can verify that compatibility read.",
    "pendingCutover": "The #707 KC registry cutover is complete. This pending-cutover rule applies only to still-unshipped course/component/member targets: do not advertise them as deployed until migrations, reconciliation, parity, and live readback pass.",
    "dualAuthority": "Forbidden. Legacy CASE KC rows and source crosswalks are immutable migration evidence only; active KC identity, versions, graph, standards links, scope, remediation, reads, and lifecycle operations use the registry-native stores.",
    "trace": {
      "decision": "curriculum_shared_supabase_migration_gate",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
    }
  },
  "ownershipModel": [
    {
      "concept": "Standards/framework source text",
      "authority": "case.cf_document + case.cf_item + case.cf_association",
      "status": "authoritative",
      "trace": {
        "decision": "curriculum_four_store_boundary",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-002-four-store-boundary"
      }
    },
    {
      "concept": "Standards provenance, rights, and readback",
      "authority": "alpha.standards_source_* records",
      "status": "authoritative target",
      "trace": {
        "decision": "curriculum_immutable_standards_source_release",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
      }
    },
    {
      "concept": "KC identity, meaning, graph, lineage, review, and firming",
      "authority": "alpha.knowledge_component* + alpha.kc_*",
      "status": "authoritative",
      "trace": {
        "decision": "curriculum_kc_storage_governance",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
      }
    },
    {
      "concept": "Reusable course and component identity",
      "authority": "alpha.course + alpha.course_component",
      "status": "authoritative target",
      "trace": {
        "decision": "curriculum_reusable_component_member_model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
      }
    },
    {
      "concept": "Ordered course-local target, renderer, and gate use",
      "authority": "alpha.course_component_member",
      "status": "authoritative target",
      "trace": {
        "decision": "curriculum_member_content_reference_gate_placement",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
      }
    },
    {
      "concept": "Content body, exact version, trust/serveability, and release eligibility",
      "authority": "Content exact-version contract",
      "status": "external authority; referenced, never copied",
      "trace": {
        "decision": "curriculum_module_boundary_rejections",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-009-cross-module-boundaries"
      }
    },
    {
      "concept": "Student mastery, attempts, progress, next task, and awarded XP",
      "authority": "Results",
      "status": "external authority",
      "trace": {
        "decision": "curriculum_module_boundary_rejections",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-009-cross-module-boundaries"
      }
    },
    {
      "concept": "Steward agent, novelty reconciliation, review queues, monitoring, generation plans, clusters",
      "authority": "Incept",
      "status": "explicitly outside Curriculum storage",
      "trace": {
        "decision": "curriculum_kc_storage_governance",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
      }
    }
  ],
  "enumSets": {
    "rights_status": [
      "unknown",
      "permitted",
      "restricted",
      "prohibited",
      "public_domain"
    ],
    "admission_outcome": [
      "green",
      "yellow",
      "red"
    ],
    "standards_material_grain": [
      "release",
      "framework",
      "standard",
      "statement",
      "attachment"
    ],
    "readback_mismatch_code": [
      "none",
      "missing_source_row",
      "unexpected_source_row",
      "text_changed",
      "identifier_changed",
      "order_changed",
      "relationship_changed",
      "rights_scope_changed",
      "raw_checksum_mismatch",
      "normalized_checksum_mismatch",
      "parser_version_mismatch"
    ],
    "kc_kind": [
      "substantive",
      "disciplinary",
      "application",
      "integrative"
    ],
    "kc_write_stored_as_assertion": [
      "alpha.knowledge_component"
    ],
    "kc_version_status": [
      "draft",
      "firm"
    ],
    "kc_relation_type": [
      "applies_to",
      "instantiates",
      "integrates",
      "interferes_with",
      "split_from",
      "merged_into",
      "supersedes"
    ],
    "kc_source_identity_mapping_kind": [
      "preserved_uuid",
      "deterministic_uuid_v5",
      "adopted_registry_source_kc_id"
    ],
    "kc_case_migration_entity_type": [
      "knowledge_component",
      "prerequisite",
      "standard_kc_map",
      "lineage"
    ],
    "kc_case_migration_disposition": [
      "accepted",
      "rejected"
    ],
    "kc_case_migration_rejection_reason": [
      "source_retired",
      "unresolved_tenant",
      "duplicate_source_identity",
      "missing_definition",
      "missing_subject_id",
      "invalid_kc_kind",
      "target_identity_collision",
      "unresolved_kc_endpoint",
      "self_loop",
      "cycle_scc",
      "not_kc_standard_pair",
      "unresolved_standard_binding",
      "ambiguous_standard_binding"
    ],
    "kc_review_decision": [
      "accept-as-new",
      "map-to-existing",
      "edit",
      "split",
      "merge",
      "reject/relocate",
      "defer"
    ],
    "firming_reason": [
      "course_approval",
      "first_genuine_response"
    ],
    "standard_kc_relationship": [
      "exact",
      "broader",
      "narrower",
      "supports"
    ],
    "course_role": [
      "main",
      "hole_filling",
      "remediation",
      "catalog"
    ],
    "component_kind": [
      "track",
      "grade",
      "course",
      "unit",
      "module",
      "chapter",
      "section",
      "topic",
      "lesson",
      "practice",
      "review",
      "quiz",
      "test",
      "mastery_gate",
      "remediation_pocket",
      "placeholder"
    ],
    "kc_scope_decision": [
      "authoritative_no_kc"
    ],
    "target_kind": [
      "course_component",
      "content_version"
    ],
    "component_target_repoint_operation": [
      "repoint",
      "attach"
    ],
    "publication_status": [
      "draft",
      "published",
      "retired"
    ],
    "gate_remediation_reason": [
      "never_learned",
      "forgot",
      "careless"
    ],
    "alpha.subject": [
      "math",
      "reading",
      "language",
      "science",
      "computer_science",
      "vocabulary",
      "writing",
      "social_studies"
    ]
  },
  "standardsAdmissionPolicy": {
    "sourceSelectionOwner": "The producer selects a source and supplies evidence under its runbook; Platform3 does not infer a source or silently broaden scope.",
    "acquisitionRule": "Acquisition records what was retrieved and from where. Acquisition alone never admits rows for generation, publication, or customer use.",
    "transportRightsRule": "Successful CASE transport proves syntax/interchange only. It is not permission to copy, transform, generate from, publish, or redistribute source content.",
    "scopeRule": "Every admission names an exact authority + subject/grade/jurisdiction/version row scope. A partial source must be named as a partial scope; it may not use the unqualified authority/framework name.",
    "rightsPrecedence": "The most-specific material-grain rights record effective at evaluation time wins. A missing, expired, conflicting, or unknown record resolves to unknown and cannot inherit a broader permitted record.",
    "counselRule": "Counsel owns disputed ownership, contract interpretation, permissions, and risk exceptions. A technical operator cannot turn yellow/red into green; the counsel decision is stored as a new effective-dated rights record with evidence_ref and counsel_decision_ref.",
    "outcomeRules": {
      "green": "All in-scope rows are bound to one immutable release; readback is lossless; effective material rights are permitted or public_domain; required attribution exists; the declared row scope is non-empty and exact. Generation/adoption may proceed for that scope only.",
      "yellow": "Evidence, scope, rights, attribution, or readback is incomplete/disputed but not conclusively prohibited. Quarantine: no generation, publication, or customer use until a new decision resolves every finding.",
      "red": "Any effective material is prohibited, the source/scope is misrepresented, lossless evidence is irrecoverable, or counsel rejects use. Reject the release for adoption; preserve audit evidence."
    },
    "failClosedRule": "Only green may enter an active standards/KC/course workflow. Yellow and red return typed Problems and never degrade to warnings.",
    "sourcePolicyReferences": [
      {
        "owner": "Curriculum",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release",
        "role": "Durable release, rights, binding, readback, and mismatch semantics"
      },
      {
        "owner": "Incept",
        "href": "https://github.com/andymontgomery-byte/incept-skill-pack/blob/main/docs/standards-source-acquisition.md",
        "role": "Producer acquisition procedure and source selection only"
      },
      {
        "owner": "1EdTech",
        "href": "https://www.imsglobal.org/spec/CASE/v1p1/",
        "role": "CASE transport/content shape only; no content-use grant"
      }
    ]
  },
  "legacyKcMigrationContract": {
    "migrationKey": "issue-707-case-kc-registry-v1",
    "sourceSystem": "case.cf_item",
    "rule": "The completed one-time #707 operator froze a named CASE snapshot, gave every discovered KC/graph/crosswalk/lineage source object exactly one accepted or typed-rejected ledger row, preserved every UUID-shaped KC id, adopted any existing knowledge_component.source_kc_id → kc_id mapping, and deterministically mapped only previously unseen semantic ids. alpha.kc_source_identity and knowledge_component.source_kc_id retain immutable migration/provenance evidence only. Neither is an active lookup, version, retire, graph, scope, or remediation alias. Source CASE KC rows remain immutable migration evidence and are not deleted.",
    "classificationException": "A legacy accepted KC whose source has no authoritative kc_kind is stored only as publication_status=draft with kc_kind=NULL and is non-publishable. NULL is not a fifth kind and no authoring API may create it. Issue #898 is the sole owner of later pedagogical classification; the migration must never infer a kind from names, granularity, or kc_type.",
    "versionRule": "Every accepted identity resolves to one immutable current version after migration. Existing immutable versions win; otherwise the snapshot definition creates deterministic version 1 with empty example arrays and migration provenance.",
    "graphRule": "Prerequisite candidates are evaluated with the existing graph by strongly connected components. Every candidate edge internal to a cyclic SCC is rejected as cycle_scc; no order-dependent edge choice is made. Source replacedBy remains migration-ledger evidence used to assign one lineage_id to all connected variants; it does not create a separate canonical lineage edge.",
    "referenceRule": "Component scope and evidence refs that match the source identity map are repointed atomically. Owner-approved kc_timeback_* test-seed evidence is deleted; all other pre-existing unresolved fixture evidence is reported unchanged and no new orphan may be introduced.",
    "executionRule": "The bulk migration is an explicit, idempotent, SERIALIZABLE, advisory-locked post-merge operator action. Default execution is read-only dry-run; startup never runs the bulk copy.",
    "trace": {
      "decision": "curriculum_kc_storage_governance",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
    }
  },
  "tables": [
    {
      "name": "alpha.standards_source_release",
      "title": "Standards Source Release",
      "purpose": "Immutable checksum-addressed evidence for one retrieved source scope.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_immutable_standards_source_release",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Platform3-minted immutable release identity derived from the canonical source scope, checksums, parser, and release evidence.",
          "constraints": "Primary key with tenant_id; never derived solely from a mutable publisher URL. An exact replay reuses this id without writing; changed evidence mints a new id.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_system",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Stable importing/source-system namespace used with source_framework_id to serialize one release lineage.",
          "example": "incept",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_framework_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Publisher/source identity shared by every immutable release in one framework lineage.",
          "example": "TX-TEKS-MATH-G3",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_authority",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Publisher or authority responsible for the source.",
          "example": "Texas Education Agency",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "official_source_url",
          "type": "URI",
          "nullability": "required",
          "meaning": "Official retrieval origin.",
          "example": "https://tea.texas.gov/academics/curriculum-standards/teks",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "declared_scope",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Exact jurisdiction, subject, grade, edition, and row-membership scope admitted by this release.",
          "constraints": "Canonical object requires jurisdiction, subject, non-empty grades, edition, rowFilter, expectedRowCount, sourceRowKeysSha256, isPartial, and officialFrameworkName. expectedRowCount and the sorted source-row-key hash cover every binding, including the framework binding. Both must match exactly; partial scopes require an honest partial_display_name distinct from officialFrameworkName.",
          "example": {
            "jurisdiction": "TX",
            "subject": "math",
            "grades": [
              3
            ],
            "edition": "2024",
            "rowFilter": "strand=3.4",
            "expectedRowCount": 130,
            "sourceRowKeysSha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
            "isPartial": true,
            "officialFrameworkName": "Texas Essential Knowledge and Skills for Mathematics"
          },
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "partial_display_name",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Honest customer-visible name for a partial source.",
          "invalidWhen": "Null when declared_scope is narrower than the official source, or equal to the unqualified authority/framework name for a partial scope.",
          "example": "Texas Math Grade 3 — Strand 3.4 only",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "license_url",
          "type": "URI",
          "nullability": "nullable",
          "meaning": "Publisher license or terms location; null never means permission.",
          "example": "https://tea.texas.gov/terms",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "release_rights_status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Release-level default rights classification.",
          "enum": "rights_status",
          "constraints": "unknown is explicit; material overrides are resolved separately.",
          "example": "unknown",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "required_attribution",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Exact attribution required when use is permitted.",
          "example": "Source: Texas Education Agency",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "retrieved_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Timestamp of raw retrieval.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "raw_artifact_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Lowercase SHA-256 of the immutable raw artifact at raw_checksum_grain.",
          "constraints": "Exactly 64 lowercase hex characters.",
          "example": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "raw_checksum_grain",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "What exact bytes the raw checksum covers.",
          "example": "downloaded_zip_bytes",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "parser_name",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Named parser used for normalization.",
          "example": "tea-teks-json",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "parser_version",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Immutable parser version.",
          "example": "2.1.0",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "normalized_artifact_ref",
          "type": "URI or opaque ref",
          "nullability": "required",
          "meaning": "Immutable normalized artifact location/reference.",
          "example": "artifact://standards/8a17f30a/normalized.json",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "normalized_artifact_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "SHA-256 of normalized bytes under normalization_profile.",
          "constraints": "Exactly 64 lowercase hex characters.",
          "example": "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "normalization_profile",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Versioned, lossless normalization rules used for readback.",
          "example": "case-lossless-v1",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_policy_ref",
          "type": "URI",
          "nullability": "required",
          "meaning": "Versioned source-selection/admission policy evidence used for this release.",
          "example": "https://github.com/andymontgomery-byte/incept-skill-pack/blob/main/docs/standards-source-acquisition.md#v1",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "imported_by",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated actor/application reference.",
          "example": "app:incept",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "imported_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned immutable insert time.",
          "example": "2026-07-16T12:01:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "supersedes_source_release_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Immediately prior immutable release in this source_system + source_framework_id lineage.",
          "relationship": "Self-FK alpha.standards_source_release within tenant; null only for the first known release or an exact historical replay response.",
          "example": "c30e0884-40a8-42e0-a969-c6fe8bdb1767",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "is_frozen",
          "type": "BOOLEAN",
          "nullability": "required",
          "meaning": "Storage guard proving this release and its bound CASE rows are append-only.",
          "constraints": "Always true. UPDATE and DELETE fail; changed reimport inserts a new superseding release.",
          "example": true,
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        }
      ],
      "mutability": "immutable/frozen; exact replay is a zero-write no-op, while changed source, scope, parser, rights default, or normalized bytes create a new release linked through supersedes_source_release_id"
    },
    {
      "name": "alpha.standards_source_row_binding",
      "title": "Standards Source Row Binding",
      "purpose": "Lossless, one-release binding from each admitted source row/material to its CASE row.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_immutable_standards_source_release",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "binding_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable binding identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "f1ad17e0-2508-4e7a-95df-93ffb5aa3399",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Owning immutable release.",
          "relationship": "Many-to-one alpha.standards_source_release.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_row_key",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Stable locator inside the raw artifact.",
          "constraints": "Unique with tenant_id + source_release_id.",
          "example": "sheet=Grade3,row=142",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "material_grain",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Rights/readback evaluation grain.",
          "enum": "standards_material_grain",
          "example": "standard",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_locator",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Lossless file/page/sheet/row/path locator.",
          "example": {
            "file": "math-g3.xlsx",
            "sheet": "Grade3",
            "row": 142
          },
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_identifier",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Publisher identifier exactly as supplied.",
          "example": "3.4A",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "case_resource_type",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Bound CASE type.",
          "constraints": "cf_document, cf_item, or cf_association.",
          "example": "cf_item",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "case_resource_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Tenant-scoped CASE row id.",
          "relationship": "Polymorphic FK validated against case_resource_type.",
          "example": "657b306e-4bd8-4938-bf1f-0951334e6a67",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "raw_statement",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Exact source statement before normalization.",
          "example": "Represent multiplication facts by using arrays.",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "normalized_statement",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Normalized CASE statement under normalization_profile.",
          "example": "Represent multiplication facts by using arrays.",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "ordinal_path",
          "type": "INTEGER[]",
          "nullability": "required",
          "meaning": "Source order path preserved for lossless replay.",
          "example": [
            3,
            4,
            1
          ],
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "binding_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Hash over release id, locator, identifiers, statements, order, and CASE target.",
          "constraints": "64 lowercase hex characters.",
          "example": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable insert time.",
          "example": "2026-07-16T12:01:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        }
      ],
      "mutability": "immutable; every imported CASE row has exactly one binding to exactly one release"
    },
    {
      "name": "alpha.standards_rights_record",
      "title": "Standards Rights Record",
      "purpose": "Effective-dated material-level permission/admission decision with counsel provenance.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_immutable_standards_source_release",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "rights_record_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Append-only rights decision identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "08d93f35-c236-4c26-a147-d86e04007cf5",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Release whose material is evaluated.",
          "relationship": "Many-to-one alpha.standards_source_release.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "material_grain",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Specificity of this decision.",
          "enum": "standards_material_grain",
          "example": "statement",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "material_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Release id or source_row_key at the declared grain.",
          "constraints": "Must resolve inside source_release_id.",
          "example": "sheet=Grade3,row=142",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "rights_status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Permission classification; unknown is explicit and fail-closed.",
          "enum": "rights_status",
          "example": "permitted",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "admission_outcome",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Deterministic operational result.",
          "enum": "admission_outcome",
          "constraints": "Only green permits adoption/generation.",
          "example": "green",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "permission_basis",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Plain-language legal/contract/public-domain basis.",
          "example": "Official public standards with attribution permitted by publisher terms.",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "allowed_uses",
          "type": "TEXT[]",
          "nullability": "required",
          "meaning": "Explicit permitted uses; absence never implies use.",
          "example": [
            "store",
            "display",
            "generate"
          ],
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "required_attribution",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Material-specific attribution overriding release default.",
          "example": "Source: Texas Education Agency",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "effective_from",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Inclusive decision start.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "effective_to",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Exclusive decision end; null is open-ended.",
          "constraints": "Must be later than effective_from; overlapping records at the same grain are rejected.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_policy_ref",
          "type": "URI",
          "nullability": "required",
          "meaning": "Versioned admission policy applied.",
          "example": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "evidence_ref",
          "type": "URI or opaque ref",
          "nullability": "required",
          "meaning": "Immutable terms/license/evidence reference.",
          "example": "artifact://rights/tea-terms-2026-07-16.pdf",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "decided_by_role",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Role accountable for the decision.",
          "constraints": "operator or counsel; operator cannot grant an exception.",
          "example": "counsel",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "counsel_decision_ref",
          "type": "URI or opaque ref",
          "nullability": "nullable",
          "meaning": "Required for disputed rights, contracts, or risk exceptions.",
          "invalidWhen": "Null when permission_basis depends on counsel interpretation or an exception.",
          "example": "legal://decision/2026-184",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable decision time.",
          "example": "2026-07-16T12:10:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        }
      ],
      "mutability": "append-only; supersede with a new effective-dated record"
    },
    {
      "name": "alpha.standards_readback_evidence",
      "title": "Standards Readback Evidence",
      "purpose": "Immutable comparison proving release-bound CASE rows reproduce the source losslessly.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_immutable_standards_source_release",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "evidence_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable check identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "25f4d781-aa71-4605-9288-53e9a6b8cf2f",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Checked release.",
          "relationship": "Many-to-one alpha.standards_source_release.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "binding_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Specific row binding; null only for release aggregate evidence.",
          "relationship": "Nullable FK alpha.standards_source_row_binding.",
          "example": "f1ad17e0-2508-4e7a-95df-93ffb5aa3399",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "raw_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Recomputed raw bytes hash.",
          "example": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "normalized_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Recomputed normalized bytes hash.",
          "example": "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "readback_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Hash of canonical source-shaped readback.",
          "example": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "mismatch_code",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Typed result; none is the only passing value.",
          "enum": "readback_mismatch_code",
          "example": "none",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "mismatch_detail",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Expected/actual locator and bounded redacted diff for failures.",
          "constraints": "Required when mismatch_code != none; no secrets or unrestricted source dumps.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "checked_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Check execution time.",
          "example": "2026-07-16T12:20:00Z",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        },
        {
          "name": "checker_version",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Deterministic readback checker version.",
          "example": "standards-readback-v1",
          "source": [
            {
              "decision": "curriculum_immutable_standards_source_release",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
            }
          ]
        }
      ],
      "mutability": "immutable evidence; a later check appends"
    },
    {
      "name": "case.cf_document",
      "title": "CASE Framework",
      "purpose": "Verbatim CASE framework identity and body; Curriculum adds no alternate standards text store.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Tenant-scoped internal row identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "91a39ab0-82b7-45f4-98fc-a1f6405a93f9",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "identifier",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Release-scoped CASE identifier; publisher identity remains in the source release and row binding.",
          "constraints": "Derived with source_release_id, so a changed reimport cannot collide with or overwrite the prior framework.",
          "example": "91a39ab0-82b7-45f4-98fc-a1f6405a93f9",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable standards release owning this framework row.",
          "relationship": "FK alpha.standards_source_release within the tenant mapping.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "supersedes_source_release_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Prior release named by the owning release; exposed beside the CASE body for historical readback.",
          "relationship": "FK alpha.standards_source_release; null on the first release.",
          "example": "c30e0884-40a8-42e0-a969-c6fe8bdb1767",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "is_frozen",
          "type": "BOOLEAN",
          "nullability": "required",
          "meaning": "Prevents UPDATE or DELETE of a release-bound framework.",
          "constraints": "True for standards frameworks; changed packages must use a new release-scoped identifier.",
          "example": true,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "body",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Lossless CASE CFDocument JSON.",
          "source": [
            {
              "upstream": "1EdTech CASE 1.1 CFDocument",
              "href": "https://www.imsglobal.org/spec/CASE/v1p1/"
            }
          ],
          "example": {
            "title": "Texas Math Grade 3",
            "creator": "TEA"
          }
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; a new source release does not mutate the prior body.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "backingSource": "1EdTech CASE 1.1 pass-through",
      "relationship": "Exactly one alpha.standards_source_row_binding pins every imported row to one release."
    },
    {
      "name": "case.cf_item",
      "title": "CASE Standard",
      "purpose": "Verbatim CASE standard statement. KCs and course components must never be stored here after cutover.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Tenant-scoped internal standard row identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "657b306e-4bd8-4938-bf1f-0951334e6a67",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "identifier",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Release-scoped CASE standard identifier; publisher code and source identifier remain losslessly bound as source evidence.",
          "constraints": "Derived with source_release_id, so the same publisher code in a changed release creates a new row.",
          "example": "657b306e-4bd8-4938-bf1f-0951334e6a67",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "cf_document_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Owning release-specific CASE framework row.",
          "relationship": "Many-to-one case.cf_document within tenant.",
          "example": "91a39ab0-82b7-45f4-98fc-a1f6405a93f9",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable release shared with the owning CASE framework and exact source-row binding.",
          "relationship": "FK alpha.standards_source_release within the tenant mapping.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "is_frozen",
          "type": "BOOLEAN",
          "nullability": "required",
          "meaning": "Prevents UPDATE or DELETE of the historical standard row.",
          "constraints": "True for imported standards; removal from a later release does not mutate or retire this historical row.",
          "example": true,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "body",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Lossless CASE CFItem JSON containing the publisher statement.",
          "source": [
            {
              "upstream": "1EdTech CASE 1.1 CFItem",
              "href": "https://www.imsglobal.org/spec/CASE/v1p1/"
            }
          ],
          "example": {
            "fullStatement": "Represent multiplication facts by using arrays."
          }
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "backingSource": "1EdTech CASE 1.1 pass-through"
    },
    {
      "name": "case.cf_association",
      "title": "CASE Standards Association",
      "purpose": "Within-framework containment and standard-to-standard alignment only.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Tenant-scoped association identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "e490c62a-a421-452e-b947-ef683875ec0b",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "association_type",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "CASE relationship for standards only.",
          "constraints": "May express standards containment/alignment; must not represent KC prerequisites, KC lineage, KC-standard maps, course structure, or members.",
          "example": "isChildOf",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "origin_node_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Origin CASE standard/framework row.",
          "relationship": "Typed CASE endpoint.",
          "example": "657b306e-4bd8-4938-bf1f-0951334e6a67",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "destination_node_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Destination CASE standard/framework row.",
          "relationship": "Typed CASE endpoint.",
          "example": "91a39ab0-82b7-45f4-98fc-a1f6405a93f9",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "body",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Lossless CASE CFAssociation JSON.",
          "source": [
            {
              "upstream": "1EdTech CASE 1.1 CFAssociation",
              "href": "https://www.imsglobal.org/spec/CASE/v1p1/"
            }
          ],
          "example": {
            "associationType": "isChildOf"
          }
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "backingSource": "1EdTech CASE 1.1 pass-through"
    },
    {
      "name": "alpha.knowledge_component",
      "title": "Knowledge Component",
      "purpose": "Persistent, course-independent masterable identity; meaning lives in immutable versions.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        },
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Persistent KC identity.",
          "constraints": "Primary key with tenant_id; never a CASE, lesson, standard, or course id.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_kc_id",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Optional producer semantic identity retained as creation provenance and migration evidence.",
          "constraints": "Unique with tenant_id among active rows when present; 1–512 characters (at most 2048 UTF-8 bytes). Never accepted as an identity resolver by create, read, version, retire, graph, scope, remediation, or Content-attribution operations; callers capture and use the returned canonical kc_id UUID. A retry uses the original Idempotency-Key or exact canonical kc_id, never source_kc_id.",
          "example": "kc:math:3:oa:ccss.math.content.3.oa.1",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "lineage_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Stable family grouping across splits/merges/supersession.",
          "constraints": "Does not replace typed lineage edges.",
          "example": "a0f70fc9-3a25-4537-a0ed-a05078774032",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "kc_kind",
          "type": "TEXT enum",
          "nullability": "required for authored KCs; nullable only for #707 legacy adoption",
          "meaning": "Governed performance kind.",
          "enum": "kc_kind",
          "constraints": "NULL means only unclassified legacy adoption pending #898; it requires publication_status=draft and is never publishable or accepted from an authoring API.",
          "example": "substantive",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "subject_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Live Platform authoring subject-registry value.",
          "constraints": "Resolve from the owning descriptor; current deployed values are documented but consumers must not copy the enum.",
          "example": "math",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "current_version_id",
          "type": "UUID",
          "nullability": "required for governed KCs; nullable only for the retained unclassified #707 legacy row",
          "meaning": "Latest appended semantic version, draft or firm.",
          "relationship": "DEFERRABLE INITIALLY DEFERRED composite FK (tenant_id, kc_id, current_version_id) to alpha.knowledge_component_version (tenant_id, kc_id, version_id), so a KC cannot select another KC's version and the identity plus first immutable version can be created atomically.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "publication_status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Identity discovery lifecycle, separate from version firming.",
          "enum": "publication_status",
          "example": "draft",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "mutable identity with ETag/If-Match; semantic edits append versions",
      "constraints": "Registry-native authoring rejects name and every CASE field because neither identity nor version owns display/containment data. source_kc_id is provenance only; kc_id is the sole active identity. Migration 018 adds the internal STORED GENERATED ALWAYS AS (retired_at IS NULL), NOT NULL content_kc_tag_active_state column and non-deferrable unique (tenant_id, kc_id, content_kc_tag_active_state) parent key; clients never submit or interpret that generated field as KC business state. Content's generated required_kc_active_state plus native content_kc_tag_active_kc_fk makes an active Content tag require this exact tenant KC to remain active, while retired tags have a NULL child state and preserve historical evidence without blocking KC retirement. The application performs friendly reference prechecks and row locking, but native PostgreSQL referential integrity—not a lock-only assumption—is the final arbiter under READ COMMITTED, REPEATABLE READ, and SERIALIZABLE. A concurrent KC retirement/tag creation or revival can end only in a typed resource-reference/foreign-key conflict or a retryable serialization failure, never a committed active-tag/retired-KC pair."
    },
    {
      "name": "alpha.knowledge_component_version",
      "title": "Knowledge Component Version",
      "purpose": "Immutable authored KC meaning and reviewable definition quality.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "version_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable version identity.",
          "constraints": "Primary key with tenant_id; unique with tenant_id + kc_id as the composite current-version FK target.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Persistent KC identity.",
          "relationship": "DEFERRABLE INITIALLY DEFERRED many-to-one FK alpha.knowledge_component; paired with knowledge_component.current_version_id for atomic first-version creation.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "version_number",
          "type": "INTEGER",
          "nullability": "required",
          "meaning": "Monotonic per-KC version number.",
          "constraints": ">=1; unique with tenant_id + kc_id.",
          "example": 1,
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Draft/firm semantic lifecycle.",
          "enum": "kc_version_status",
          "constraints": "Only a firming event may change draft to firm; all other fields remain immutable.",
          "example": "draft",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "definition",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Verb-first observable performance definition, independent of any course.",
          "example": "Represent multiplication facts using equal-size arrays.",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "positive_examples",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Examples that satisfy the boundary.",
          "example": [
            "Build 4 rows of 6 and state 4 × 6 = 24."
          ],
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "negative_examples",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Near misses/non-examples.",
          "example": [
            "Count objects without representing equal groups."
          ],
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "boundary_statement",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "What is deliberately excluded from this KC.",
          "example": "Does not require interpreting division remainders.",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "misconceptions",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Known course-independent misconceptions.",
          "example": [
            "Swaps number of groups and group size without preserving the model."
          ],
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "instructional_classification",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Course-independent instructional metadata; never pace/order/cluster fields.",
          "example": {
            "knowledgeType": "procedure"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Sources and authoring chain for the definition.",
          "example": {
            "source": "review:math-owner-42"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "confidence",
          "type": "NUMERIC(4,3)",
          "nullability": "required",
          "meaning": "Confidence in [0,1].",
          "constraints": "0 <= confidence <= 1.",
          "example": 0.94,
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "author_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated human/application author.",
          "example": "person:math-owner",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable authored time.",
          "example": "2026-07-16T13:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "append-only; firming changes status only through an immutable alpha.kc_firming_event"
    },
    {
      "name": "alpha.kc_case_migration_snapshot",
      "title": "KC CASE Migration Snapshot",
      "purpose": "Immutable named source snapshot and reconciliation proof for the one-time #707 cutover.",
      "authority": "immutable_migration_evidence",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "snapshot_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Deterministic identity for the captured source hash.",
          "constraints": "Primary key.",
          "example": "114bc4fb-6ac4-5be8-b93e-e3e96687d245",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "migration_key",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Single idempotency key for this operator migration.",
          "constraints": "Unique; issue-707-case-kc-registry-v1.",
          "example": "issue-707-case-kc-registry-v1",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "snapshot_name",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Human-readable immutable name including the capture time.",
          "constraints": "Unique.",
          "example": "issue-707-case-kc-registry-v1@2026-07-20T12:00:00.000Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_system",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Exact copied authority at cutover.",
          "example": "case.cf_item",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "captured_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Database capture time inside the SERIALIZABLE transaction.",
          "example": "2026-07-20T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_txid",
          "type": "BIGINT",
          "nullability": "required",
          "meaning": "PostgreSQL transaction id that captured and applied the source snapshot.",
          "example": 123456,
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_hash_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "SHA-256 over the sorted entity/source-key/source-row hashes.",
          "constraints": "64 lowercase hex.",
          "example": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "code_commit_sha",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Merged, gated repository commit that executed the operator.",
          "constraints": "40 lowercase hex and reachable from origin/main at apply time.",
          "example": "0123456789abcdef0123456789abcdef01234567",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "discovered_counts",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Per-entity discovered counts from this snapshot.",
          "example": {
            "knowledge_component": 6290,
            "prerequisite": 3565
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "accepted_counts",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Per-entity accepted counts.",
          "example": {
            "knowledge_component": 6280,
            "prerequisite": 3559
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "rejected_counts",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Per-entity totals and typed-reason counts.",
          "example": {
            "knowledge_component": {
              "total": 10,
              "reasons": {
                "source_retired": 9,
                "missing_subject_id": 1
              }
            }
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "reference_proof",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Source-row retention, scope/evidence resolution, current-version, and DAG proof.",
          "example": {
            "source_case_rows_retained": true,
            "prerequisite_dag": true,
            "new_orphaned_kc_references": 0
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "status",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Atomic run state.",
          "constraints": "applying or completed; only applying→completed is legal.",
          "example": "completed",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "completed_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Commit-bound completion timestamp.",
          "example": "2026-07-20T12:03:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "insert applying, then exactly one applying→completed transition; no delete"
    },
    {
      "name": "alpha.kc_source_identity",
      "title": "KC Source Identity",
      "purpose": "Immutable #707 migration evidence mapping a captured source id to the canonical registry UUID.",
      "authority": "immutable_migration_evidence",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        },
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_system",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Source namespace.",
          "example": "case.cf_item",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_tenant_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "CASE tenant reference exactly as captured.",
          "example": "demo",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_kc_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "CASE KC id exactly as captured, including semantic ids.",
          "constraints": "Unique with tenant_id + source_system.",
          "example": "kc:math:3:equal-groups",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Canonical registry identity.",
          "relationship": "FK alpha.knowledge_component.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "mapping_kind",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Whether the source id was preserved, deterministically remapped, or adopted from an existing operational source_kc_id crosswalk.",
          "enum": "kc_source_identity_mapping_kind",
          "example": "adopted_registry_source_kc_id",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_snapshot_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Snapshot that admitted this mapping.",
          "relationship": "FK alpha.kc_case_migration_snapshot.",
          "example": "114bc4fb-6ac4-5be8-b93e-e3e96687d245",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_row_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Hash of the exact migration payload for this KC.",
          "constraints": "64 lowercase hex.",
          "example": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            },
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "insert-only; no update/delete; runtime may inspect it only to refuse a legacy write, never to resolve an active operation",
      "uniqueness": "tenant_id + source_system + source_kc_id and tenant_id + source_system + kc_id"
    },
    {
      "name": "alpha.kc_case_migration_ledger",
      "title": "KC CASE Migration Ledger",
      "purpose": "One immutable accepted/rejected disposition for every discovered #707 source object.",
      "authority": "immutable_migration_evidence",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "snapshot_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Owning named snapshot.",
          "relationship": "FK alpha.kc_case_migration_snapshot.",
          "example": "114bc4fb-6ac4-5be8-b93e-e3e96687d245",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "entity_type",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Reconciled population.",
          "enum": "kc_case_migration_entity_type",
          "example": "prerequisite",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_tenant_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Source CASE tenant reference.",
          "example": "demo",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Source CFItem/CFAssociation id.",
          "example": "0a77d011-0f33-4e2e-8aac-5b59860e1fc1",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Resolved target tenant; null only for unresolved_tenant rejection.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_row_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Hash of source_payload.",
          "constraints": "64 lowercase hex.",
          "example": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_payload",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Minimal exact migration fields, not an unrestricted copyrighted source dump.",
          "example": {
            "association_type": "precedes",
            "origin_id": "kc-a",
            "destination_id": "kc-b"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "disposition",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Accepted or rejected.",
          "enum": "kc_case_migration_disposition",
          "example": "rejected",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "rejection_reason",
          "type": "TEXT enum",
          "nullability": "nullable",
          "meaning": "Typed reason; required exactly when disposition=rejected.",
          "enum": "kc_case_migration_rejection_reason",
          "example": "cycle_scc",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "target_refs",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Canonical ids or deterministic rejection evidence such as SCC membership.",
          "example": {
            "prerequisite_kc_id": "49371a30-9796-4bbd-a523-bd38a876e415"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "insert-only; no update/delete",
      "primaryKey": "snapshot_id + entity_type + source_tenant_ref + source_id"
    },
    {
      "name": "alpha.kc_prerequisite",
      "title": "KC Prerequisite",
      "purpose": "Canonical directed acyclic prerequisite graph.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "prerequisite_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Edge identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "76d63c09-4090-4f90-939f-fe46d83d7d18",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "prerequisite_kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "KC that must come first.",
          "relationship": "FK active alpha.knowledge_component.",
          "example": "92b2eaf0-8ff1-42ea-a352-3ac08b9d5951",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "dependent_kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "KC enabled by the prerequisite.",
          "relationship": "FK active alpha.knowledge_component.",
          "constraints": "Must differ from prerequisite_kc_id; insert/update must preserve DAG acyclicity.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Why/source for the edge.",
          "example": {
            "reviewDecisionId": "review-71"
          },
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "confidence",
          "type": "NUMERIC(4,3)",
          "nullability": "required",
          "meaning": "Edge confidence in [0,1].",
          "example": 0.9,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "uniqueness": "tenant_id + prerequisite_kc_id + dependent_kc_id among active rows",
      "constraints": "Sole prerequisite DAG. It is never derived from CASE precedes or isChildOf at runtime."
    },
    {
      "name": "alpha.kc_relation",
      "title": "Typed KC Relation",
      "purpose": "Governed non-prerequisite semantic and lineage edges.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "relation_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Edge identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "d02a4eb7-44ce-407c-a42d-0b4b5e96b0e2",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "origin_kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Typed relation origin.",
          "relationship": "FK active alpha.knowledge_component.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "destination_kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Typed relation destination.",
          "relationship": "FK active alpha.knowledge_component.",
          "constraints": "Must differ from origin_kc_id.",
          "example": "b2cbd2ff-42ce-421b-a18c-07c488931ceb",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "relation_type",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Semantic or lineage relation.",
          "enum": "kc_relation_type",
          "constraints": "Prerequisite is forbidden here; split/merge/supersede endpoints share lineage_id after transition.",
          "example": "applies_to",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Source/review evidence.",
          "example": {
            "reviewDecisionId": "review-72"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "confidence",
          "type": "NUMERIC(4,3)",
          "nullability": "required",
          "meaning": "Relation confidence in [0,1].",
          "example": 0.86,
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "uniqueness": "tenant_id + origin_kc_id + destination_kc_id + relation_type among active rows",
      "constraints": "Not a DAG; only alpha.kc_prerequisite is acyclic. No relation type creates a KC containment tree."
    },
    {
      "name": "alpha.kc_review_decision",
      "title": "KC Review Decision",
      "purpose": "Immutable structured review audit for one KC version.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "review_decision_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable audit identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "217b17b7-8f32-4901-a534-660593822932",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "version_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Reviewed KC version.",
          "relationship": "FK alpha.knowledge_component_version.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "decision",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Structured review outcome.",
          "enum": "kc_review_decision",
          "example": "edit",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "edit_diff",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Captured before/after or JSON Patch when decision edits/splits/merges.",
          "invalidWhen": "Null for edit, split, or merge without an explicit no-change explanation in rationale.",
          "example": [
            {
              "op": "replace",
              "path": "/definition",
              "value": "Represent multiplication facts using equal-size arrays."
            }
          ],
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "rationale",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Review reasoning.",
          "example": "Separates array representation from later division interpretation.",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Inputs/evidence considered.",
          "example": {
            "sourceRefs": [
              "TEKS:3.4A"
            ]
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "actor_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated reviewer.",
          "example": "person:math-owner",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "decided_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable decision time.",
          "example": "2026-07-16T13:15:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "immutable; review queues/prioritization remain outside Platform3"
    },
    {
      "name": "alpha.course",
      "title": "Course",
      "purpose": "Stable reusable course identity, role, scope, lifecycle, and approval reference.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_reusable_component_member_model",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "course_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Stable course identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "d7eb3c5c-5051-4860-bc8d-25919be371dd",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "subject_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Live authoring subject-registry value.",
          "example": "math",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "grade_scope",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Exact grade/band scope.",
          "example": {
            "min": 3,
            "max": 3
          },
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "course_role",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Progress-denominator role.",
          "enum": "course_role",
          "constraints": "Only main contributes to grade-level expected-XP denominator.",
          "example": "main",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "name",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Customer-visible course name.",
          "example": "Grade 3 Core Math",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "description",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Course purpose, not student state.",
          "example": "Core grade-three mathematics sequence.",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "lineage_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Course-family lineage identity.",
          "example": "a20513bf-6a4c-424f-b714-32eb3d68f2ed",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "publication_status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Course authoring lifecycle and learner-routing release boundary.",
          "enum": "publication_status",
          "constraints": "Create as draft. Publish only after the complete intended member/component tree is read back, every descendant is published bottom-up, and this course root is published last.",
          "example": "draft",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "current_approval_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Latest approved immutable course snapshot.",
          "relationship": "FK alpha.course_approval.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "entry_policy_ref",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Versioned alpha.policy placement reference; no copied numbers.",
          "example": "alpha.policy.placement_weights:v3",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "exit_policy_ref",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Versioned alpha.policy exit reference; no copied numbers.",
          "example": "alpha.policy.mastery_cutoff:v5",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        }
      ],
      "mutability": "ETag/If-Match mutable identity"
    },
    {
      "name": "alpha.course_component",
      "title": "Reusable Course Component",
      "purpose": "Reusable student-independent structure/KC scope decision and expected-effort leaf/fallback.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_reusable_component_member_model",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "component_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Stable reusable component identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "5579cb54-e751-4eed-bc8e-95ab00b2f47e",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "kind",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Governed component kind.",
          "enum": "component_kind",
          "example": "lesson",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "scope_kc_ids",
          "type": "UUID[]",
          "nullability": "required",
          "meaning": "Active KC identities in scope, or the explicit empty factual scope paired with authoritative_no_kc.",
          "constraints": "Non-empty for ordinary lesson/acquisition components. An empty array is valid only for a kind=lesson exact Content target whose kc_scope_decision is authoritative_no_kc. Producer or learning-scientist clustering grain is preserved, so a scoped lesson may carry many KCs. Never use semantic source ids, standards, similarity, course roots, or lesson ids as KC UUIDs.",
          "relationship": "Each non-empty element FK active alpha.knowledge_component; an authoritative_no_kc empty array creates no KC relationship.",
          "example": [
            "49371a30-9796-4bbd-a523-bd38a876e415",
            "92b2eaf0-8ff1-42ea-a352-3ac08b9d5951"
          ],
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "kc_scope_decision",
          "type": "TEXT enum",
          "nullability": "nullable",
          "meaning": "Producer-authoritative decision that this exact content-bearing lesson intentionally has no KC attribution.",
          "enum": "kc_scope_decision",
          "constraints": "Only authoritative_no_kc is accepted; valid only for kind=lesson with scope_kc_ids=[], an exact immutable Content target, and a compatible renderer. Null means the ordinary non-empty scope rule applies. The decision is factual absence, not permission to infer or synthesize a KC.",
          "example": "authoritative_no_kc",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "name",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Reusable component name.",
          "example": "Arrays for multiplication",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "description",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Reusable course-independent description.",
          "example": "Initial acquisition of equal-group array representation.",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "expected_xp",
          "type": "NUMERIC",
          "nullability": "nullable",
          "meaning": "Student-independent expected effort as a leaf value or container fallback.",
          "constraints": ">=0; units xp_eq_expected_minutes; ignored at aggregate time whenever an active descendant carries expected_xp.",
          "example": 18,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "lineage_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Reusable component-family lineage.",
          "example": "62b5cc63-8cd8-4ce8-af53-07a74b08ef63",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        },
        {
          "name": "publication_status",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Reusable component lifecycle and learner-routing eligibility state.",
          "enum": "publication_status",
          "constraints": "Course assembly creates draft rows and publishes bottom-up. A draft, retired, or missing status on the selected frontier or any containment ancestor makes the course non-routable.",
          "example": "published",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            }
          ]
        }
      ],
      "mutability": "ETag/If-Match mutable identity; target, renderer, order, and gate fields are forbidden here"
    },
    {
      "name": "alpha.course_component_member",
      "title": "Ordered Course Component Member",
      "purpose": "One ordered course-local use of a reusable component or exact Content version.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_reusable_component_member_model",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
        },
        {
          "decision": "curriculum_member_content_reference_gate_placement",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "member_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Stable ordered-use identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "c11c31b8-aef5-499d-874d-cd8dc435e920",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "course_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Owning course.",
          "relationship": "FK active alpha.course.",
          "example": "d7eb3c5c-5051-4860-bc8d-25919be371dd",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "parent_component_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Reusable parent container; null means course root.",
          "relationship": "Nullable FK active alpha.course_component.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "position",
          "type": "INTEGER",
          "nullability": "required",
          "meaning": "Stable sibling order.",
          "constraints": ">=0; unique with tenant_id + course_id + parent_component_id among active rows.",
          "example": 4,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "target_kind",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Discriminator for exactly one target shape.",
          "enum": "target_kind",
          "example": "course_component",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "target_component_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Reusable component target when target_kind=course_component.",
          "relationship": "FK active alpha.course_component.",
          "invalidWhen": "Null for course_component or non-null for content_version.",
          "example": "5579cb54-e751-4eed-bc8e-95ab00b2f47e",
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "content_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Content identity when target_kind=content_version.",
          "relationship": "Opaque Content-owned id resolved through the Content API.",
          "invalidWhen": "Present without content_version_id or for course_component.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "content_version_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Exact immutable Content version; never a floating latest pointer.",
          "relationship": "Content exact-version contract.",
          "invalidWhen": "Null when target_kind=content_version, or not owned by content_id.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "content_kind",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Typed Content kind echoed only for reference validation/routing.",
          "constraints": "Must equal Content exact-version readback; enum remains Content-owned and is not copied into Curriculum's enumSets.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "renderer_ref",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Active renderer capability accepting content_kind.",
          "relationship": "Platform renderer capability registry.",
          "invalidWhen": "Missing/unknown/inactive/incompatible for a Content target.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "gates",
          "type": "BOOLEAN",
          "nullability": "required",
          "meaning": "Whether this course-local member enforces a gate.",
          "example": false,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "passing_criteria_ref",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Versioned alpha.policy reference for a gating member.",
          "invalidWhen": "Missing when gates=true or present when gates=false; never stores a threshold number.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "on_fail",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Typed remediation protocol for a gating member.",
          "constraints": "Entries use never_learned→lesson, forgot→review, careless→practice. alpha.policy.pp100_lesson_mastery.v2 requires retry=resume_same_score_walk; every other current gate policy requires retry=same_or_equivalent_form.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_reusable_component_member_model",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
            },
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        }
      ],
      "mutability": "ETag/If-Match mutable; member authoring and launch revalidate Content exact-version serveability and release eligibility without storing eligibility response fields"
    },
    {
      "name": "alpha.component_target_repoint_audit",
      "title": "Component Target Repoint Audit",
      "purpose": "Immutable audit row for every accepted producer self-service repoint/attach of a component's exact Content pin.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_member_content_reference_gate_placement",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope of the repointed component.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "demo",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "repoint_audit_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable audit identity, one per accepted repoint or attach.",
          "constraints": "Primary key.",
          "example": "0d1f5f6a-64f7-4a5e-8f8f-3a2b1c0d9e8f",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "component_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Repointed CASE-backed component identity.",
          "relationship": "Deployed compatibility FK to the active case.cf_item component; the accepted target model records the analogous member repoint.",
          "example": "3d5e5eb4-fefe-59e0-ba33-0397203b51f1",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "operation",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Whether an existing exact pin moved within one Content identity (repoint) or a first pin was attached to an unpinned component (attach).",
          "enum": "component_target_repoint_operation",
          "example": "repoint",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "previous_target_ref",
          "type": "JSONB",
          "nullability": "nullable",
          "meaning": "Exact pin the compare-and-set premise matched; null exactly for attach.",
          "constraints": "repoint requires the full previous exact tuple; attach requires null.",
          "example": {
            "module": "content",
            "content_kind": "article",
            "content_id": "41639afc-c1d1-952a-f579-ecb870428386",
            "content_version_id": "6641dfed-3323-4cde-a8b3-19058caf5f77"
          },
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "new_target_ref",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Exact eligible tuple now pinned by the component.",
          "constraints": "Must have passed Content-owned exact-version release eligibility with practice_eligible usage scope inside the accepting request.",
          "example": {
            "module": "content",
            "content_kind": "article",
            "content_id": "41639afc-c1d1-952a-f579-ecb870428386",
            "content_version_id": "fa0933dc-d3b2-4956-957d-e2fd0b9892f5"
          },
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "actor_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated producer/integrator subject that performed the operation.",
          "example": "integrator:ap-one",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "request_id",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Originating request id for support correlation.",
          "example": "req_4f518591-06b4-44e1-bfbe-aab60c598bdd",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_member_content_reference_gate_placement",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
            }
          ]
        }
      ],
      "mutability": "insert-only immutable audit; UPDATE, DELETE, and TRUNCATE are rejected by storage triggers"
    },
    {
      "name": "alpha.course_approval",
      "title": "Course Approval",
      "purpose": "Immutable approval boundary pinning one reviewed course graph.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "approval_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable approval identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "3810e51f-e4e3-45c9-9169-593cf6c1a5f7",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "course_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Approved course.",
          "relationship": "FK alpha.course.",
          "example": "d7eb3c5c-5051-4860-bc8d-25919be371dd",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "course_graph_sha256",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Hash of active course/component/member graph at approval.",
          "example": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "approved_by",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated approver.",
          "example": "person:math-owner",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "approved_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable approval time.",
          "example": "2026-07-16T14:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Approval evidence/review references.",
          "example": {
            "reviewId": "course-review-12"
          },
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "immutable; one transaction inserts approval + complete KC snapshot + firming events"
    },
    {
      "name": "alpha.course_approval_kc_snapshot",
      "title": "Course Approval KC Snapshot",
      "purpose": "Immutable exact KC-version set referenced by an approved course.",
      "authority": "authoritative_target_pending_verified_cutover",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "approval_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Owning immutable approval.",
          "relationship": "FK alpha.course_approval.",
          "example": "3810e51f-e4e3-45c9-9169-593cf6c1a5f7",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Referenced KC identity.",
          "relationship": "FK alpha.knowledge_component.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "version_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Exact version approved, whether already firm or firmed in this transaction.",
          "relationship": "FK alpha.knowledge_component_version for kc_id.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "snapshot_source",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Where the course graph referenced this KC.",
          "example": "course_component:5579cb54-e751-4eed-bc8e-95ab00b2f47e",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable insert time.",
          "example": "2026-07-16T14:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "primaryKey": "tenant_id + approval_id + kc_id",
      "mutability": "immutable and complete; approval fails atomically if any active course KC lacks a version snapshot"
    },
    {
      "name": "alpha.kc_firming_event",
      "title": "KC Firming Event",
      "purpose": "Immutable proof of the only two legal draft-to-firm transitions.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_storage_governance",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "firming_event_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable event identity.",
          "constraints": "Primary key with tenant_id.",
          "example": "62c6f3c7-d9ca-4d04-aa1b-a345332694b4",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "version_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "KC version made firm.",
          "relationship": "FK alpha.knowledge_component_version.",
          "constraints": "At most one effective firming event per version.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "firming_reason",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Course approval or live-learning safety backstop.",
          "enum": "firming_reason",
          "example": "course_approval",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "source_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "approval_id, or governed live_learning first-genuine-response evidence ref.",
          "constraints": "course_approval must resolve to a snapshot containing version_id; first_genuine_response requires an explicit live_learning signal and first response evidence.",
          "example": "approval:3810e51f-e4e3-45c9-9169-593cf6c1a5f7",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "actor_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Authenticated/system actor.",
          "example": "app:curriculum",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        },
        {
          "name": "firmed_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Immutable firming time.",
          "example": "2026-07-16T14:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_storage_governance",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
            }
          ]
        }
      ],
      "mutability": "immutable; publication, assignment, generation, review acceptance, or ordinary learner activity are not legal reasons",
      "uniqueness": "tenant_id + version_id (at most one effective firming event per KC version)"
    },
    {
      "name": "alpha.standard_kc_map",
      "title": "Standard–KC Crosswalk",
      "purpose": "Release-pinned first-class standard-to-KC mapping with relationship, provenance, and confidence.",
      "authority": "authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned creation time.",
          "constraints": "Immutable after insert.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Server-assigned last mutable-row update time.",
          "constraints": "Changes only through a successful If-Match write.",
          "example": "2026-07-16T12:00:00Z",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "retired_at",
          "type": "TIMESTAMPTZ",
          "nullability": "nullable",
          "meaning": "Soft-retire timestamp; null means active.",
          "constraints": "Ordinary reads and reference validation require retired_at IS NULL.",
          "example": null,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "map_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Crosswalk identity.",
          "constraints": "Unique with tenant_id; the table primary key is tenant_id + standard_id + kc_id.",
          "example": "db37d14f-af1d-4df2-9047-3d18df32ee0d",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "source_release_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Immutable standards release pin.",
          "relationship": "FK alpha.standards_source_release.",
          "example": "8a17f30a-2a39-4a4c-b44e-643c3342756d",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "standard_binding_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Exact bound standard row in that release.",
          "relationship": "FK alpha.standards_source_row_binding where case_resource_type=cf_item.",
          "example": "f1ad17e0-2508-4e7a-95df-93ffb5aa3399",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "standard_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Release-specific frozen CASE standard identity pinned by standard_binding_id.",
          "relationship": "FK release-scoped case.cf_item; must equal the bound row's case_resource_id.",
          "example": "0f0eb990-7692-4bac-a0d0-aecb1cdd53ae",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Mapped active KC identity.",
          "relationship": "FK alpha.knowledge_component.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "relationship",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Direction/grain of the mapping.",
          "enum": "standard_kc_relationship",
          "example": "supports",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "provenance",
          "type": "JSONB",
          "nullability": "required",
          "meaning": "Mapping source/reviewer/method.",
          "constraints": "Must be a non-empty JSON object. A guarded forward migration converts an existing TEXT column only when information_schema reports TEXT, wrapping every exact legacy string as {legacy: <exact stored string>}; arrays, null, empty objects, and new scalar writes are rejected.",
          "example": {
            "reviewer": "person:math-owner",
            "method": "manual"
          },
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "confidence",
          "type": "NUMERIC(4,3)",
          "nullability": "required",
          "meaning": "Mapping confidence in [0,1].",
          "example": 0.92,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "constraints": "Never represented as case.cf_association isPartOf; source release, binding, and standard_id must agree"
    },
    {
      "name": "alpha.named_kc_set_v",
      "title": "Named KC Set Projection",
      "purpose": "Read-only named projection without a stored KC containment tree.",
      "authority": "derived_view",
      "architectureTrace": [
        {
          "decision": "curriculum_kc_registry_standard_separation",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
        }
      ],
      "fields": [
        {
          "name": "tenant_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "Verified JWT tenant scope; part of every key and join.",
          "constraints": "Must equal the authenticated tenant; never accepted from a URL or request body.",
          "example": "11111111-1111-4111-8111-111111111111",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "set_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Deterministic projection id.",
          "example": "course-approval:3810e51f-e4e3-45c9-9169-593cf6c1a5f7",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "set_kind",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Projection source: course_approval, standards_release, or lineage_family.",
          "example": "course_approval",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "name",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Deterministic human-readable set name.",
          "example": "Grade 3 Core Math approved KC set",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "kc_id",
          "type": "UUID",
          "nullability": "required",
          "meaning": "KC member.",
          "relationship": "FK active alpha.knowledge_component.",
          "example": "49371a30-9796-4bbd-a523-bd38a876e415",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "version_id",
          "type": "UUID",
          "nullability": "nullable",
          "meaning": "Exact version when projection source pins one.",
          "example": "7c3f9e18-d244-41b2-9727-79fb4c97f11a",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "ordinal",
          "type": "INTEGER",
          "nullability": "nullable",
          "meaning": "Deterministic display order; not a prerequisite or containment edge.",
          "example": 1,
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        },
        {
          "name": "source_ref",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Approval/release/lineage row that mechanically produces membership.",
          "example": "approval:3810e51f-e4e3-45c9-9169-593cf6c1a5f7",
          "source": [
            {
              "decision": "curriculum_kc_registry_standard_separation",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
            }
          ]
        }
      ],
      "mutability": "read-only projection over approval snapshots, release-pinned crosswalks, or lineage ids"
    },
    {
      "name": "curriculum.component_sample",
      "title": "Deployed Compatibility Component Sample",
      "purpose": "Non-authoritative sample contract retained only for the deployed CASE-backed conformance probe.",
      "authority": "deployed_compatibility_non_authoritative",
      "architectureTrace": [
        {
          "decision": "curriculum_shared_supabase_migration_gate",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
        }
      ],
      "fields": [
        {
          "name": "component_id",
          "type": "TEXT",
          "nullability": "required",
          "meaning": "Legacy CASE-backed component identifier.",
          "example": "component-correction-live-58a7658fb35e",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "kind",
          "type": "TEXT enum",
          "nullability": "required",
          "meaning": "Legacy served kind.",
          "enum": "component_kind",
          "example": "lesson",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "subject_id",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Legacy served subject.",
          "example": "math",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "grade_level",
          "type": "INTEGER",
          "nullability": "nullable",
          "meaning": "Legacy served grade.",
          "example": 3,
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "course_grade_mode",
          "type": "TEXT",
          "nullability": "nullable",
          "meaning": "Legacy compatibility value.",
          "example": "single_grade",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "expected_xp",
          "type": "NUMERIC",
          "nullability": "nullable",
          "meaning": "Legacy served expected effort.",
          "example": 18,
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "kc_scope_decision",
          "type": "TEXT enum",
          "nullability": "nullable",
          "meaning": "Explicit producer-authoritative no-KC lesson decision echoed by deployed compatibility reads.",
          "enum": "kc_scope_decision",
          "example": "authoritative_no_kc",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "created_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Legacy created time.",
          "example": "2026-07-09T13:23:39Z",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        },
        {
          "name": "updated_at",
          "type": "TIMESTAMPTZ",
          "nullability": "required",
          "meaning": "Legacy updated time.",
          "example": "2026-07-09T13:23:39Z",
          "source": [
            {
              "decision": "curriculum_shared_supabase_migration_gate",
              "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-011-shared-supabase-migration-gate"
            }
          ]
        }
      ],
      "warning": "Do not generate target migrations, KC storage, course storage, or authoring guidance from this table."
    }
  ],
  "expectedXpContract": {
    "unit": "xp_eq_expected_minutes",
    "leafRule": "An active expected-XP-bearing component with no active expected-XP-bearing descendant contributes its own expected_xp.",
    "fallbackRule": "A container expected_xp contributes only when its active subtree has no descendant with expected_xp.",
    "aggregateRule": "Course/grade/track totals sum contributing leaves/fallbacks once per active member path. Reuse in two courses contributes once to each course, not once globally.",
    "roleRule": "Only course_role=main contributes to the Results grade-level denominator; hole_filling, remediation, and catalog remain separately queryable.",
    "forbidden": "Never average student actuals, add a container to descendant values, or read awarded/remaining XP from Curriculum.",
    "trace": {
      "decision": "curriculum_reusable_component_member_model",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
    }
  },
  "contentExactVersionContract": {
    "referenceShape": {
      "content_id": "UUID",
      "content_version_id": "UUID",
      "content_kind": "Content-owned TEXT"
    },
    "eligibilityRead": "GET /tenants/{tenantId}/alpha/content/items/{contentId}/versions/{contentVersionId}/release-eligibility",
    "rule": "At member write and again at launch, Curriculum reads the exact Content version and Content-owned release-eligibility response. The version must belong to content_id, be serveable, and be eligible. An authoritative missing, blocked, revoked, malformed, or otherwise non-green response fails closed as curriculum:content_not_eligible, while a target tuple mismatch becomes curriculum:content_version_mismatch. Network failure, request/operation timeout, or an upstream HTTP 5xx is HTTP 503 curriculum:content_unavailable with bounded Retry-After and is never mistaken for semantic ineligibility. Only component create, component update/publish, and TimeBack ingest prove that this check precedes their mutation; those exact boundaries may finalize an evidence-free failed_transient receipt and reclaim the identical Idempotency-Key after Content recovers. Reads and any unmarked or post-mutation 503 remain non-retry-authoritative. Content's content.invalid_test_bank_member_contract and content.bank_kc_attribution_incomplete responses are never flattened into eligibility, transport, skip, or fallback behavior: both map losslessly to HTTP 409 curriculum:invalid_content_bank_member_contract with the safe upstream code exposed in the public RFC 7807 cause field.",
    "storageRule": "Curriculum stores only content_id, content_version_id, and the typed content_kind needed for reference validation/routing. It stores no producer verdict, quality-bar id/version, release status, evidence ref, policy field, Content body, answer, or eligibility cache.",
    "deploymentState": "Accepted Content target; callers must treat 404/unsupported eligibility read as target-not-deployed, not as permission. The Curriculum target route cannot claim ready until exact-version Content eligibility is live.",
    "source": "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/data_dictionary/",
    "trace": {
      "decision": "curriculum_member_content_reference_gate_placement",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
    }
  },
  "boundaryContract": {
    "rule": "Curriculum owns student-independent scope, sequence, KC identity, reusable course structure, and ordered teaching delivery. It references but never stores Content bodies, Results state, Events, People and Orgs facts, Policy numbers, or Incept steward behavior.",
    "trace": {
      "decision": "curriculum_shared_map_boundary",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-001-boundary"
    }
  },
  "aliasContract": {
    "source": "loop/curriculum/artifacts/alpha/architecture/site/alias-map.json",
    "rule": "Every public name resolves to exactly one authoritative store, derived view, compatibility read, or surface command. Aliases never move/copy data, and a view is never a second authority.",
    "trace": {
      "decision": "curriculum_alias_map_contract",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-007-alias-map-and-derived-views"
    }
  },
  "subjectRegistryContract": {
    "owner": "alpha.policy.authoring_subject_registry.v2026-07-16.issue-771",
    "source": "loop/context/authoring-subject-registry.json",
    "deployedValues": [
      "math",
      "reading",
      "language",
      "science",
      "computer_science",
      "vocabulary",
      "writing",
      "social_studies"
    ],
    "approvedPendingValues": [],
    "adapterAliases": {
      "AP CSA": "computer_science",
      "Computer Science": "computer_science",
      "Social Studies": "social_studies"
    },
    "rule": "Generate owning Curriculum artifacts from the machine-readable registry, but consume the deployed descriptor at runtime; do not copy this list into clients or confuse it with the six-subject Results/HMG reporting subset. Economics, history, geography, and civics remain course-grain disciplines rather than subject ids.",
    "trace": {
      "decision": "curriculum_alpha_authoring_subject_registry",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-013-subject-registry"
    }
  },
  "rendererRegistryContract": {
    "owner": "Platform Applications renderer capability registry",
    "requiredReadback": [
      "renderer_ref",
      "accepted_content_kinds",
      "integration_endpoint",
      "integration_protocol",
      "playground_url",
      "implementation_pointer",
      "lifecycle_state",
      "verified_capability_evidence"
    ],
    "rule": "Only course_component_member selects renderer_ref. Writes reject missing, unknown, inactive, or content-kind-incompatible capabilities; renderer_kind is compatibility only when it resolves to the same registry row.",
    "trace": {
      "decision": "curriculum_renderer_registry_contract",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
    }
  },
  "policyContract": {
    "curriculumCreates": [
      "alpha.policy.mastery_cutoff",
      "alpha.policy.placement_weights",
      "alpha.policy.xp_award_formula",
      "alpha.policy.spaced_repetition_model",
      "alpha.policy.gate_retake_cooldown"
    ],
    "resultsCreates": [
      "alpha.policy.reward_rules",
      "alpha.policy.stuck_attempt_threshold",
      "alpha.policy.growth_x_target",
      "alpha.policy.proxy_subject_rules",
      "alpha.policy.school_year_boundaries",
      "alpha.policy.school_day",
      "alpha.policy.rit_calculator",
      "alpha.policy.99_level_thresholds",
      "alpha.policy.tenure_buckets"
    ],
    "rule": "Every value is a versioned alpha.policy row. Curriculum identity rows store references only, never thresholds, weights, rewards, calendars, cut scores, or retake numbers.",
    "trace": {
      "decision": "curriculum_teaching_engine_policy_config",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-012-teaching-engine-policy-config"
    }
  },
  "useCaseContracts": [
    {
      "id": "author",
      "api": "Per-resource KC, version, relation, review, course, component, member, approval, firming, crosswalk, and import writes under /alpha/curriculum/v1",
      "rule": "Author into the owning table; semantic KC edits append immutable versions, optional source_kc_id remains provenance only, and every graph/scope/remediation reference uses an exact active tenant-owned registry kc_id validated before any write. A direct POST /components with a caller-supplied component_id that matches a soft-retired CASE component reactivates that same identity only as draft: preserve its original created_at, advance its CASE version, clear retired_at, and reactivate a supplied same-id retired containment edge transactionally. If a surviving active child is reattached to the recreated parent through a new edge id, the active exact child/parent pair supersedes retired same-pair history for current tree, routing, and publication validation while the tombstone remains immutable audit history. An isolated component PATCH with parent_component_id + position locks and replaces exactly one active containment edge, preserves stable component/edge identity plus every other incident reference, and rejects zero/multiple parents, cycles, cross-tenant parents, or an occupied target position without partial writes; generic association POST refuses a second active parent, and TimeBack ingest may replay initial placement but cannot replace or add a parent. It never returns 201 without durable active readback. KC clustering remains producer/learning-scientist-owned and non-empty multi-KC lesson scope is preserved. The only sanctioned empty lesson scope is direct kind=lesson authoring with an exact eligible target_ref, compatible renderer_ref, scope_kc_refs=[], and kc_scope_decision=authoritative_no_kc; Curriculum echoes that decision and never synthesizes a KC.",
      "problems": [
        "curriculum:validation_failed",
        "curriculum:reference_unresolved",
        "curriculum:kc_semantics_conflict",
        "curriculum:precondition_required",
        "curriculum:precondition_failed"
      ],
      "trace": {
        "decision": "curriculum_kc_authoring_contract",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-014-kc-authoring-contract"
      }
    },
    {
      "id": "place",
      "api": "GET /alpha/curriculum/v1/tracks/{trackId}/placement-candidates?studentId=…&subjectId=…",
      "rule": "Resolve the track entry_policy_ref. PowerPath starts at the lowest or screener-selected likely-mastered grade, tests upward, and returns the first grade below the Policy mastery threshold. MAP/RIT may choose only the starting point, never final placement.",
      "problems": [
        "curriculum:not_found",
        "curriculum:reference_unresolved"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "route",
      "api": "GET /alpha/curriculum/v1/courses/{courseId}/next-lesson?studentId=…&subjectId=…",
      "rule": "Choose the first ordered lesson/review/practice/mastery-gate frontier before applying publication filters; require the course root, that candidate, and every containment ancestor to be published; require the exact current graph to have an immutable approval with a complete firm, active KC-version snapshot; and revalidate the candidate's exact Content version through Content-owned release eligibility. Draft, retired, changed, unapproved, incomplete, unavailable, malformed, mismatched, or ineligible state fails closed and never exposes a later node. Read student state from Results; Curriculum never stores or recomputes the student's realized path.",
      "problems": [
        "curriculum:not_found",
        "curriculum:lesson_structure_missing",
        "curriculum:course_not_routable",
        "curriculum:content_not_eligible",
        "curriculum:content_unavailable",
        "curriculum:content_version_mismatch",
        "curriculum:invalid_content_bank_member_contract"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "gate",
      "api": "GET /alpha/curriculum/v1/gates/{gateId}/status?studentId=…",
      "rule": "Read Results evidence and the member's passing_criteria_ref. Curriculum returns the resolved contract/status and never recomputes or stores Policy cut values or Results outcomes.",
      "problems": [
        "curriculum:not_found",
        "curriculum:invalid_gate_contract"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "remediate",
      "api": "GET /alpha/curriculum/v1/gates/{gateId}/remediation?studentId=…&resultRecordId=…",
      "rule": "Return typed shared choices never_learned→lesson, forgot→review, careless→practice. Results owns any per-student inserted sequence; clients never classify the miss.",
      "problems": [
        "curriculum:not_found",
        "curriculum:invalid_gate_contract"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    }
  ],
  "transportContracts": [
    {
      "id": "new-course-ingest",
      "api": "POST Content /tenants/{tenantId}/alpha/content/imports/qti-package; for one primary object GET then PATCH /alpha/curriculum/v1/components/{lessonId}; for multiple items POST /alpha/curriculum/v1/components once per targeted child practice/review component; GET /alpha/curriculum/v1/components/{lessonId}/tree or GET /alpha/curriculum/v1/components?parentId={lessonId}",
      "rule": "Provision a new course in owner order: import/admit its standards framework and use the returned framework identity in course standards_framework_refs; have the owning author create each missing governed registry KC with POST /alpha/curriculum/v1/kcs using stored_as=alpha.knowledge_component, definition, and optional provenance-only source_kc_id; retry only with the original Idempotency-Key or exact canonical kc_id, because source_kc_id never resolves an identity; capture and verify the returned canonical kc_id through GET /alpha/curriculum/v1/kcs/{kcId}; use only that exact UUID in prerequisite, scope, remediation, standards-map, and Content-attribution references. Write prerequisite ordering through POST /alpha/curriculum/v1/kc-prerequisites; write other typed graph semantics to alpha.kc_relation and standards links to alpha.standard_kc_map; never create KC containment. Import Content, then route each returned exact Content tuple {content_id, content_version_id, content_kind} from Curriculum after Content-owned release-eligibility succeeds. stored_as is a governed-authority assertion, not a physical-store selector. Migrated CASE/source ids are immutable evidence, never active read/retire aliases or UUID reference values. An ordinary scoped lesson preserves the producer-authored non-empty KC cluster and may carry many scope_kc_refs. When the producer explicitly decides that one content-bearing lesson has no authored KC attribution, POST /alpha/curriculum/v1/components sanctions only kind=lesson with the exact eligible target_ref, compatible renderer_ref, scope_kc_refs=[], and kc_scope_decision=authoritative_no_kc; Curriculum never substitutes a similarity, course-root, standards, or Content-tag binding. The accepted target cardinality is one course_component_member per ordered Content use. Until member routes are deployed, the CASE component compatibility adapter uses one stable targeted child practice/review component per additional item under the lesson; repeatedly PATCHing the lesson target replaces the prior direct target and is forbidden for many-item attachment. Standards import never mints KCs, Content kc-tags never encode lesson membership, and the frozen Content curriculum_node_id archive is not a current routing index.",
      "readback": "The deployed compatibility BFF reads every targeted child from the lesson tree or parent-filtered component list; the target BFF reads member rows after verified cutover. Content /kc-tags may independently prove weighted item-to-KC attribution. GET Content items?curriculum_node_id=… remains historical archive compatibility only, has no automatic TTL, and receives no new placements.",
      "trace": {
        "decision": "curriculum_member_content_reference_gate_placement",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
      }
    },
    {
      "id": "timeback-source-ingest",
      "api": "POST /alpha/curriculum/v1/ingest/timeback-course-refs",
      "rule": "Normalize only the courses → course_components → component_resources → resources boundary into course, reusable component, and ordered member rows. Resources pass through Content first, whose handoff must supply content_id, content_version_id, and content_kind; missing, malformed, mismatched, or ineligible exact versions fail closed and Curriculum never infers latest. Every lesson preserves its authored non-empty active kc_id cluster, including multi-KC scope; learning_objectives, standards, standard, and other standards-shaped evidence return curriculum:adapter_rejected and must use POST /alpha/curriculum/v1/standards-frameworks/import; course ingest never writes CASE standards or fabricates KCs; a source quiz is not a gate without explicit member gate fields.",
      "readback": "Assembly writes deterministic identities as draft, verifies the exact intended tree, publishes components bottom-up, and publishes the course root last. Same-run retry upserts the same identities. Successful complete imports materialize readable course/component/member rows and become structurally routable only after root-last publication; launch still requires a matching immutable course approval, a complete firm active KC-version snapshot, and fresh exact Content eligibility. Source-empty or KC-unscoped known anchors return 409 curriculum:lesson_structure_missing; draft, retired, partially published, unapproved, or snapshot-incomplete graphs return 409 curriculum:course_not_routable and never skip forward.",
      "trace": {
        "decision": "curriculum_source_shaped_ingest_adapter",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-008-source-shaped-ingest"
      }
    },
    {
      "id": "common-cartridge",
      "api": "POST /alpha/curriculum/v1/transports/common-cartridge/import and POST /alpha/curriculum/v1/transports/common-cartridge/preview",
      "rule": "Import/export is transport over CASE standards, the course/component/member graph, and exact-version Content references. Produce bundles on demand and never store a cartridge as Curriculum authority.",
      "trace": {
        "decision": "curriculum_common_cartridge_transport_only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-010-common-cartridge-and-external-consumers"
      }
    }
  ],
  "authoringIntegrityContract": {
    "rules": [
      "Every non-empty scope_kc_refs value and remediation_entries.kc_ref resolves exactly to an active tenant-owned alpha.knowledge_component.kc_id before any write; retired, cross-tenant, missing, CASE, source, or standards ids return a typed failure with no partial persistence. Multi-KC authored clusters are preserved. Registry-native POST /kcs is owner-only, accepts only stored_as=alpha.knowledge_component with definition, optional provenance-only source_kc_id, and no CASE fields; callers use its returned kc_id.",
      "An empty lesson scope is accepted only for a direct kind=lesson component with an exact eligible target_ref, a compatible registered renderer_ref, scope_kc_refs=[], and kc_scope_decision=authoritative_no_kc. Detail, tree, and next-lesson echo the decision and exact target; the lesson contributes an empty kc_version_snapshot and no mastery evidence. Omitted/unresolved scope and every inferred similarity, course-root, standards, or Content-tag binding remain forbidden.",
      "Parent/component/member references resolve tenant-locally without cycles.",
      "POST /components inserts a never-seen caller identity or transactionally reactivates the matching soft-retired CASE identity as draft while preserving created_at and advancing version; a successful 201 is never a normalization-only receipt and must be immediately readable with its new ETag.",
      "At authoring and ordinary launch, Content targets resolve through Content-owned release eligibility for the exact {content_id, content_version_id, content_kind}; every unavailable, malformed, mismatched, blocked, revoked, unresolved, or otherwise ineligible answer fails closed, and Curriculum never substitutes latest or stores copied producer evidence. The only launch exception is Content's demo-only governed test-serve lane: Curriculum supplies the exact student person_id, Content independently requires an active grant plus People & Orgs reality=test/synthetic, and no form is returned until Content appends an exact bank/form authorization receipt.",
      "renderer_ref resolves to an active capability accepting the target kind.",
      "entry_policy_ref, exit_policy_ref, and passing_criteria_ref resolve to versioned alpha.policy rows.",
      "Retirement that strands an active member is rejected unless the reference is repointed atomically."
    ],
    "problem": "curriculum:reference_unresolved",
    "trace": {
      "decision": "curriculum_authoring_referential_integrity",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-015-authoring-referential-integrity"
    }
  },
  "assessmentContracts": [
    {
      "id": "powerpath-100-lesson-mastery-v2",
      "policy_ref": "alpha.policy.pp100_lesson_mastery.v2",
      "decisionSource": "loop/context/powerpath100-decision.md",
      "curriculumOwnedFields": [
        "gate_component_id",
        "target_ref exact adaptive test_bank version",
        "passing_criteria_ref",
        "on_fail remediation protocol",
        "source_refs"
      ],
      "resultsOwnedFields": [
        "attempt_id",
        "frozen exact question pool",
        "deterministic score-band selection",
        "first-response evidence",
        "current score",
        "session pause boundary",
        "evaluation status",
        "terminal_reason",
        "gate_pass",
        "retrieval eligibility",
        "next_task"
      ],
      "rule": "A PP100 gate binds one exact Content adaptive bank and this exact versioned policy. Curriculum owns placement and remediation routing but does not select a fixed form, choose a question, store a score, or decide mastery. Results freezes the exact eligible Content pool at attempt start, deterministically selects an unseen question from the current score band, applies the governed score walk, pauses the same attempt for remediation after 30 responses in one session, and resumes with score and history intact. Mastery and spaced-retrieval eligibility occur only at exactly 100; errors can set the score back but can never make mastery mathematically unreachable. At scores 90–99 only Content-calibrated hard questions at standardized-test rigor are eligible, with no downward fallback unless the owning blueprint marks the lesson prerequisite.",
      "trace": {
        "decision": "curriculum_mastery_gate_test_bank_reference",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-013-mastery-gate-test-bank-reference"
      }
    },
    {
      "id": "test-bank-next-form",
      "rule": "This fixed-form route remains for non-PP100 gates and immutable historical PP100 v1 attempts. PP100 v2 never calls it: Results resolves the gate's exact pp100_adaptive_shards bank directly through the governed Content pool contract. Ordinary fixed-form learners launch only a published, complete gate whose exact bank and candidate form versions pass Content-owned release eligibility. Published gates always try that ordinary path first, and only an authoritative ineligible answer may enter Content's governed test-serve lane; timeouts, network errors, malformed answers, and target mismatches fail closed. Content's typed invalid-bank graph answers (content.invalid_test_bank_member_contract or content.bank_kc_attribution_incomplete) map immediately to HTTP 409 curriculum:invalid_content_bank_member_contract and can never enter test-serve, be treated as empty membership, or skip to a later form. A targetless draft rejects before Content reads, but a draft gate with a complete exact test_bank target may launch only when the exact student person_id is authorized by Content's demo-only grant plus live People & Orgs test/synthetic reality. Both fixed-form lanes evaluate at most 50 immutable exact members, require practice_eligible relationship and referenced-item scopes, and choose the same lowest-index unseen form. Test-serve additionally requires Content to atomically revalidate the exact bank/form membership and append an immutable authorization receipt before Curriculum returns serve_mode=test plus receipt/grant ids. A denied real identity keeps curriculum:invalid_gate_contract for a draft gate. Empty/oversized membership remains curriculum:invalid_gate_contract, no eligible forms remains curriculum:content_not_eligible, and only an eligible set with zero unseen forms is curriculum:bank_exhausted. Curriculum never substitutes latest, accepts a preview flag, or caches the test authorization.",
      "traces": [
        {
          "decision": "curriculum_mastery_gate_test_bank_reference",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-013-mastery-gate-test-bank-reference"
        },
        {
          "decision": "curriculum_governed_test_identity_draft_gate_launch",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-governed-test-serve"
        }
      ]
    },
    {
      "id": "primary-kc-coverage",
      "rule": "Each blueprint item counts toward exactly one primary KC; secondary Q-matrix tags do not count twice. Standards breadth resolves the primary KC through alpha.standard_kc_map, never by substituting a standard for KC identity.",
      "trace": {
        "decision": "curriculum_ls_pin_item_kc_cardinality",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-016-ls-pin-item-kc-cardinality"
      }
    },
    {
      "id": "comparable-forms-and-passing-loss",
      "rule": "Fixed forms are comparable only when every hard blueprint constraint matches and item overlap is zero. passing_rule carries per-KC/gateway loss assumptions and defaults strict for prerequisite gates; numeric cuts stay in alpha.policy and the source corpus says 90%, not 89.5%.",
      "traces": [
        {
          "decision": "curriculum_ls_pin_comparable_forms",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-017-ls-pin-comparable-forms"
        },
        {
          "decision": "curriculum_ls_pin_passing_rule_loss",
          "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-018-ls-pin-passing-rule-loss"
        }
      ]
    }
  ],
  "apiAxes": [
    {
      "id": "write-granularity",
      "rule": "Per-resource target writes plus named bulk commands for standards release, Common Cartridge, and TimeBack ingest; no second KC representation or permanent dual write.",
      "trace": {
        "decision": "curriculum_api_write_granularity",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-001-write-granularity"
      }
    },
    {
      "id": "read-shape",
      "rule": "List, detail, and narrow sub-collection reads preserve identity/member separation and expose stored governed outputs without Incept computations.",
      "trace": {
        "decision": "curriculum_api_read_shape",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-002-read-shape"
      }
    },
    {
      "id": "query",
      "rule": "Typed filters, stable sort, cursor paging, CASE offset only where inherited, updated_since polling, and 400 curriculum:unsupported_query_parameter for every unsupported parameter.",
      "trace": {
        "decision": "curriculum_api_query_model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-003-query-model"
      }
    },
    {
      "id": "concurrency",
      "rule": "Mutable rows require ETag/If-Match (428 missing, 412 stale); immutable evidence/version/snapshot/event/audit rows have no PATCH route.",
      "trace": {
        "decision": "curriculum_api_concurrency",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-004-concurrency"
      }
    },
    {
      "id": "idempotency",
      "rule": "Every POST/PATCH/DELETE/import/remediation insertion uses Idempotency-Key in platform.idempotency_key with module=curriculum and surface=alpha. Exactly one server lease-token owner may mutate and finalize a canonical request hash; a live same-hash contender receives bounded Retry-After, a different hash conflicts, and only an explicitly rollback-safe failed_transient classification may be reclaimed. Curriculum Content eligibility may use failed_transient only when the typed 503 is marked at a proven pre-mutation create/update/TimeBack-ingest boundary and the owner finalizes no response, resource, header, or lock evidence; generic or post-mutation 5xx remains commit_uncertain.",
      "trace": {
        "decision": "curriculum_api_idempotency",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-005-idempotency"
      }
    },
    {
      "id": "auth",
      "rule": "Platform HS256 bearer JWT with tenantId, role(s), and curriculum:read/write/import/admin scopes; no school/class/student-scoped claims on shared Curriculum rows.",
      "trace": {
        "decision": "curriculum_api_auth",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-006-auth"
      }
    },
    {
      "id": "eventing",
      "rule": "Poll list endpoints with updated_since. Webhooks remain deferred until three approved integrations in 90 days prove polling blocks a Curriculum workflow.",
      "trace": {
        "decision": "curriculum_api_eventing",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-007-eventing"
      }
    },
    {
      "id": "errors",
      "rule": "RFC 7807 with stable type URI, curriculum: code, requestId, traceId, fieldErrors, and rowErrors for bulk commands; Problems never use HTTP 200.",
      "trace": {
        "decision": "curriculum_api_error_envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-008-errors"
      }
    },
    {
      "id": "tenant-routing",
      "rule": "Tenant comes only from the verified JWT on flat /alpha/curriculum/v1 paths; never from URL or body.",
      "trace": {
        "decision": "curriculum_api_tenant_routing",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-009-tenant-routing"
      }
    },
    {
      "id": "conformance",
      "rule": "Local and deployed evidence covers ownership, KC lifecycle/graphs, standards provenance/readback, reuse, source ingest, transport round-trip, auth/errors/idempotency/concurrency, and leak-free downstream consumers; no official certification claim.",
      "trace": {
        "decision": "curriculum_api_conformance_evidence",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-010-conformance"
      }
    },
    {
      "id": "privacy",
      "rule": "Tenant scope, audit provenance, soft-retire semantics, immutable source history, redacted errors/logs/evidence, and no learner PII beyond typed personalization refs. An active exact isChildOf child/parent pair is the current containment projection and supersedes retired same-pair history without erasing its tombstone. Retention/erasure waits for Platform policy.",
      "trace": {
        "decision": "curriculum_api_privacy_retention",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-011-privacy-retention"
      }
    },
    {
      "id": "lists",
      "rule": "List every canonical collection named by the architecture. Derived per-kind/tree reads aid discovery but never become storage authority; no Incept queue/novelty/monitor/plan endpoints.",
      "trace": {
        "decision": "curriculum_api_list_endpoints",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caxis-012-list-endpoints"
      }
    }
  ],
  "rawApiTwins": [
    {
      "id": "standards-release-admit",
      "title": "Import, bind, verify, and admit a partial standards release",
      "api": "POST /alpha/curriculum/v1/standards-frameworks/import with Idempotency-Key; GET /alpha/curriculum/v1/standards-source-releases/{sourceReleaseId}/readback",
      "rawSql": "-- The API resolves platform.idempotency_key before this transaction: an exact active request hash/protocol/server lease token owns mutation and finalization; terminal rows replay exact status/body/headers; live same-hash contenders return curriculum:idempotency_in_progress; different hashes return curriculum:idempotency_conflict.\nBEGIN ISOLATION LEVEL SERIALIZABLE;\nINSERT INTO alpha.standards_source_release (tenant_id,source_release_id,source_authority,official_source_url,declared_scope,partial_display_name,license_url,release_rights_status,required_attribution,retrieved_at,raw_artifact_sha256,raw_checksum_grain,parser_name,parser_version,normalized_artifact_ref,normalized_artifact_sha256,normalization_profile,source_policy_ref,imported_by,imported_at)\nVALUES (:tenant_id,:release_id,:source_authority,:official_source_url,:declared_scope,:partial_display_name,:license_url,:release_rights_status,:required_attribution,:retrieved_at,:raw_sha256,:raw_checksum_grain,:parser_name,:parser_version,:normalized_artifact_ref,:normalized_sha256,:normalization_profile,:source_policy_ref,:imported_by,now())\n;\nINSERT INTO case.cf_document (tenant_id,id,identifier,body,retired_at) VALUES (:tenant_id,:document_id,:document_identifier,:document_body,NULL);\nINSERT INTO case.cf_item (tenant_id,id,identifier,cf_document_id,body,retired_at) VALUES (:tenant_id,:item_id,:item_identifier,:document_id,:item_body,NULL);\nINSERT INTO alpha.standards_source_row_binding (tenant_id,binding_id,source_release_id,source_row_key,material_grain,source_locator,source_identifier,case_resource_type,case_resource_id,raw_statement,normalized_statement,ordinal_path,binding_sha256,created_at) VALUES\n(:tenant_id,:document_binding_id,:release_id,:document_source_row_key,'framework',:document_source_locator,:document_identifier,'cf_document',:document_id,:document_raw_title,:document_normalized_title,:document_ordinal_path,:document_binding_sha256,now()),\n(:tenant_id,:item_binding_id,:release_id,:item_source_row_key,'statement',:item_source_locator,:item_identifier,'cf_item',:item_id,:item_raw_statement,:item_normalized_statement,:item_ordinal_path,:item_binding_sha256,now());\nINSERT INTO alpha.standards_rights_record (tenant_id,rights_record_id,source_release_id,material_grain,material_ref,rights_status,admission_outcome,permission_basis,allowed_uses,required_attribution,effective_from,effective_to,source_policy_ref,evidence_ref,decided_by_role,counsel_decision_ref,created_at) VALUES\n(:tenant_id,:release_rights_record_id,:release_id,'release',:release_id::text,:release_rights_status,:release_admission_outcome,:release_permission_basis,:release_allowed_uses,:release_required_attribution,:rights_effective_from,:rights_effective_to,:source_policy_ref,:release_evidence_ref,:release_decided_by_role,:release_counsel_decision_ref,now()),\n(:tenant_id,:item_rights_record_id,:release_id,'statement',:item_source_row_key,:item_rights_status,:item_admission_outcome,:item_permission_basis,:item_allowed_uses,:item_required_attribution,:rights_effective_from,:rights_effective_to,:source_policy_ref,:item_evidence_ref,:item_decided_by_role,:item_counsel_decision_ref,now());\nINSERT INTO alpha.standards_readback_evidence (tenant_id,evidence_id,source_release_id,binding_id,raw_sha256,normalized_sha256,readback_sha256,mismatch_code,mismatch_detail,checked_at,checker_version) VALUES\n(:tenant_id,:document_evidence_id,:release_id,:document_binding_id,:raw_sha256,:normalized_sha256,:document_readback_sha256,:document_mismatch_code,:document_mismatch_detail,now(),:checker_version),\n(:tenant_id,:item_evidence_id,:release_id,:item_binding_id,:raw_sha256,:normalized_sha256,:item_readback_sha256,:item_mismatch_code,:item_mismatch_detail,now(),:checker_version);\nWITH scope_check AS (\n  SELECT release.source_release_id,count(binding.binding_id) AS binding_count,\n    jsonb_typeof(release.declared_scope)='object'\n    AND NULLIF(release.declared_scope->>'jurisdiction','') IS NOT NULL\n    AND NULLIF(release.declared_scope->>'subject','') IS NOT NULL\n    AND NULLIF(release.declared_scope->>'edition','') IS NOT NULL\n    AND jsonb_typeof(release.declared_scope->'grades')='array' AND jsonb_array_length(release.declared_scope->'grades')>0\n    AND jsonb_typeof(release.declared_scope->'rowFilter')='string' AND NULLIF(release.declared_scope->>'rowFilter','') IS NOT NULL\n    AND (release.declared_scope->>'expectedRowCount') ~ '^[1-9][0-9]*$'\n    AND (release.declared_scope->>'sourceRowKeysSha256') ~ '^[0-9a-f]{64}$'\n    AND (release.declared_scope->>'isPartial') IN ('true','false')\n    AND NULLIF(release.declared_scope->>'officialFrameworkName','') IS NOT NULL\n    AND CASE WHEN (release.declared_scope->>'expectedRowCount') ~ '^[1-9][0-9]*$' THEN (release.declared_scope->>'expectedRowCount')::bigint=count(binding.binding_id) ELSE false END\n    AND release.declared_scope->>'sourceRowKeysSha256'=encode(digest(COALESCE(string_agg(binding.source_row_key,E'\n' ORDER BY binding.source_row_key),''),'sha256'),'hex')\n    AND ((release.declared_scope->>'isPartial')='false' AND release.partial_display_name IS NULL OR (release.declared_scope->>'isPartial')='true' AND NULLIF(release.partial_display_name,'') IS NOT NULL AND release.partial_display_name<>release.declared_scope->>'officialFrameworkName') AS scope_exact\n  FROM alpha.standards_source_release release LEFT JOIN alpha.standards_source_row_binding binding ON binding.tenant_id=release.tenant_id AND binding.source_release_id=release.source_release_id\n  WHERE release.tenant_id=:tenant_id AND release.source_release_id=:release_id\n  GROUP BY release.source_release_id,release.declared_scope,release.partial_display_name\n), ranked_rights AS (\n  SELECT binding.binding_id,rights.rights_status,rights.admission_outcome,(rights.rights_status='public_domain' OR COALESCE(rights.required_attribution,release.required_attribution) IS NOT NULL) AS attribution_satisfied,count(*) OVER (PARTITION BY binding.binding_id,CASE WHEN rights.material_grain='release' THEN 'release' ELSE 'specific' END) AS active_at_specificity,row_number() OVER (PARTITION BY binding.binding_id ORDER BY CASE WHEN rights.material_grain='release' THEN 1 ELSE 2 END DESC,rights.effective_from DESC,rights.created_at DESC) AS precedence\n  FROM alpha.standards_source_row_binding binding JOIN alpha.standards_source_release release ON release.tenant_id=binding.tenant_id AND release.source_release_id=binding.source_release_id JOIN alpha.standards_rights_record rights ON rights.tenant_id=binding.tenant_id AND rights.source_release_id=binding.source_release_id AND ((rights.material_grain=binding.material_grain AND rights.material_ref=binding.source_row_key) OR (rights.material_grain='release' AND rights.material_ref=binding.source_release_id::text)) AND rights.effective_from<=:evaluation_time AND (rights.effective_to IS NULL OR rights.effective_to>:evaluation_time)\n  WHERE binding.tenant_id=:tenant_id AND binding.source_release_id=:release_id\n), evidence_status AS (\n  SELECT binding_id,count(*) AS evidence_count,bool_and(mismatch_code='none') AS all_pass,bool_or(mismatch_code<>'none') AS has_mismatch\n  FROM alpha.standards_readback_evidence WHERE tenant_id=:tenant_id AND source_release_id=:release_id AND binding_id IS NOT NULL GROUP BY binding_id\n), release_check AS (\n  SELECT scope.binding_count,scope.scope_exact,count(DISTINCT evidence.binding_id) FILTER (WHERE evidence.evidence_count>0 AND evidence.all_pass) AS passing_readbacks,count(DISTINCT rights.binding_id) FILTER (WHERE rights.precedence=1 AND rights.active_at_specificity=1 AND rights.admission_outcome='green' AND rights.rights_status IN ('permitted','public_domain') AND rights.attribution_satisfied) AS green_rights,COALESCE(bool_or(rights.precedence=1 AND rights.active_at_specificity>1),false) AS has_rights_conflict,COALESCE(bool_or(rights.precedence=1 AND (rights.admission_outcome='red' OR rights.rights_status='prohibited')),false) AS has_red,COALESCE(bool_or(evidence.has_mismatch),false) AS has_any_mismatch\n  FROM scope_check scope LEFT JOIN alpha.standards_source_row_binding binding ON binding.tenant_id=:tenant_id AND binding.source_release_id=scope.source_release_id LEFT JOIN evidence_status evidence ON evidence.binding_id=binding.binding_id LEFT JOIN ranked_rights rights ON rights.binding_id=binding.binding_id\n  GROUP BY scope.binding_count,scope.scope_exact\n)\nSELECT CASE WHEN binding_count=0 OR NOT scope_exact OR has_any_mismatch OR has_red THEN 'red' WHEN has_rights_conflict THEN 'yellow' WHEN binding_count=passing_readbacks AND binding_count=green_rights THEN 'green' ELSE 'yellow' END AS admission_outcome,binding_count,scope_exact,passing_readbacks,green_rights,has_any_mismatch FROM release_check;\nCOMMIT;",
      "guardrails": [
        "Tenant predicate on every read/write",
        "Bounded serialization",
        "Idempotency replay happens before the transaction; every release-id collision aborts",
        "Canonical declared scope count + sorted row-key hash must equal every binding",
        "Every CASE row has one binding",
        "Every evidence row for every binding must pass",
        "Most-specific effective rights wins",
        "Only green becomes adoptable"
      ],
      "problems": [
        "curriculum:standards_scope_invalid",
        "curriculum:rights_unresolved",
        "curriculum:standards_readback_mismatch",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_immutable_standards_source_release",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-019-standards-source-release"
      }
    },
    {
      "id": "kc-author-review-relate",
      "title": "Author, version, review, relate, and crosswalk a KC",
      "api": "POST /alpha/curriculum/v1/kcs; POST /alpha/curriculum/v1/kcs/{kcId}/versions; POST /alpha/curriculum/v1/kc-prerequisites; POST /alpha/curriculum/v1/kc-relations; POST /alpha/curriculum/v1/kc-review-decisions; POST /alpha/curriculum/v1/standard-kc-maps",
      "rawSql": "BEGIN ISOLATION LEVEL SERIALIZABLE;\nSET CONSTRAINTS ALL DEFERRED;\n-- Every prerequisite create, correction, and retirement acquires this same tenant-scoped transaction lock; serialization failures are retried with the same Idempotency-Key.\nSELECT pg_advisory_xact_lock(hashtextextended('curriculum:kc-prerequisite:'||:tenant_id::text,0));\nINSERT INTO alpha.knowledge_component (tenant_id,kc_id,source_kc_id,lineage_id,kc_kind,subject_id,current_version_id,publication_status,created_at,updated_at) VALUES (:tenant_id,:kc_id,:source_kc_id,:lineage_id,:kc_kind,:subject_id,:version_id,'draft',now(),now());\nINSERT INTO alpha.knowledge_component_version (tenant_id,version_id,kc_id,version_number,status,definition,positive_examples,negative_examples,boundary_statement,misconceptions,instructional_classification,provenance,confidence,author_ref,created_at) VALUES (:tenant_id,:version_id,:kc_id,1,'draft',:definition,:positive_examples,:negative_examples,:boundary_statement,:misconceptions,:instructional_classification,:provenance,:confidence,:author_ref,now());\nINSERT INTO alpha.kc_prerequisite (tenant_id,from_kc_id,to_kc_id,version,prerequisite_id,prerequisite_kc_id,dependent_kc_id,provenance,confidence,created_at,updated_at) SELECT :tenant_id,:prerequisite_kc_id,:kc_id,1,:edge_id,:prerequisite_kc_id,:kc_id,:edge_provenance,:edge_confidence,now(),now() WHERE NOT EXISTS (WITH RECURSIVE reach(kc_id) AS (SELECT dependent_kc_id FROM alpha.kc_prerequisite WHERE tenant_id=:tenant_id AND prerequisite_kc_id=:kc_id AND retired_at IS NULL UNION SELECT p.dependent_kc_id FROM alpha.kc_prerequisite p JOIN reach r ON p.prerequisite_kc_id=r.kc_id WHERE p.tenant_id=:tenant_id AND p.retired_at IS NULL) SELECT 1 FROM reach WHERE kc_id=:prerequisite_kc_id);\nDO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM alpha.kc_prerequisite WHERE tenant_id=:tenant_id AND prerequisite_id=:edge_id) THEN RAISE EXCEPTION 'curriculum:prerequisite_cycle'; END IF; END $$;\nINSERT INTO alpha.kc_relation (tenant_id,relation_id,origin_kc_id,destination_kc_id,relation_type,provenance,confidence,created_at,updated_at) VALUES (:tenant_id,:relation_id,:kc_id,:related_kc_id,'applies_to',:relation_provenance,:relation_confidence,now(),now());\nINSERT INTO alpha.kc_review_decision (tenant_id,review_decision_id,version_id,decision,edit_diff,rationale,provenance,actor_ref,decided_at) VALUES (:tenant_id,:review_id,:version_id,:decision,:edit_diff,:rationale,:review_provenance,:actor_ref,now());\nINSERT INTO alpha.standard_kc_map (tenant_id,map_id,source_release_id,standard_binding_id,standard_id,kc_id,relationship,provenance,confidence,created_at,updated_at) VALUES (:tenant_id,:map_id,:source_release_id,:standard_binding_id,:standard_id,:kc_id,:relationship,:map_provenance,:map_confidence,now(),now());\nCOMMIT;",
      "guardrails": [
        "No CASE KC row",
        "POST /kcs is owner-only and accepts stored_as=alpha.knowledge_component only with definition, optional provenance-only source_kc_id, and no document_id, name, or containment field; create replay, GET, version, and retire accept the exact canonical kc_id only",
        "source_kc_id is never a create-or-resolve key: reusing it for a different or server-minted canonical kc_id returns a typed conflict without partial rows even when semantics match, and it never enables a later lookup/reference fallback; HTTP retries use the original Idempotency-Key",
        "Semantic source ids and the #707 crosswalk remain immutable evidence only and are never written into UUID reference fields",
        "Every scope/remediation/graph reference is an active tenant registry UUID",
        "Semantic edits append",
        "Every prerequisite mutation takes one tenant-scoped graph lock inside SERIALIZABLE",
        "Serialization failures replay through Idempotency-Key",
        "alpha.kc_prerequisite alone is acyclic",
        "alpha.kc_relation holds other typed non-DAG semantics",
        "alpha.standard_kc_map pins release + binding",
        "KCs have no containment tree",
        "Steward queues/monitoring are absent"
      ],
      "problems": [
        "curriculum:invalid_kc_kind",
        "curriculum:kc_definition_quality",
        "curriculum:kc_semantics_conflict",
        "curriculum:prerequisite_cycle",
        "curriculum:invalid_kc_relation",
        "curriculum:precondition_failed"
      ],
      "trace": {
        "decision": "curriculum_kc_authoring_contract",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-014-kc-authoring-contract"
      }
    },
    {
      "id": "course-approval-firm",
      "title": "Approve a course, snapshot every KC version, and firm drafts atomically",
      "api": "POST /alpha/curriculum/v1/courses/{courseId}/approvals with Idempotency-Key",
      "integratorPolicy": "An app integrator may invoke this workflow directly with its Platform-issued tenant-scoped credential. An ordinary course approval needs no per-course owner ruling.",
      "authorization": "Bearer JWT with curriculum:write",
      "requestBody": "{\"approved_by\":\"integrator:ap-one\",\"provenance\":{\"source\":\"ap-one:course-approval\",\"course_ref\":\"{integratorCourseRef}\"}}",
      "preconditions": [
        "The course root is published and not retired.",
        "The current graph is complete and contains at least one governed KC reference.",
        "Every referenced KC is active, published, and resolves to its exact current immutable version.",
        "Each exact Content gate target has independently passed Content-owned trust and release eligibility before gate publication."
      ],
      "readback": [
        "Require POST success to return the immutable approval with its complete exact KC-version snapshot.",
        "GET /alpha/curriculum/v1/courses/{courseId}/approvals and match the approval id and snapshot.",
        "GET /alpha/curriculum/v1/courses/{courseId}/next-lesson and require it to echo the current approval and firm snapshot; changed or incomplete graphs fail closed."
      ],
      "turnaround": "The authorized approval transaction is synchronous. If the integrator lacks curriculum:write, request that narrow tenant credential through Platform tenant onboarding; this contract defines no credential-provisioning SLA and there is no per-course approval queue.",
      "rawSql": "BEGIN ISOLATION LEVEL SERIALIZABLE;\nSELECT course_id FROM alpha.course WHERE tenant_id=:tenant_id AND course_id=:course_id AND retired_at IS NULL FOR UPDATE;\nCREATE TEMP TABLE _approval_scope (kc_id uuid PRIMARY KEY, version_id uuid NOT NULL, snapshot_source text NOT NULL) ON COMMIT DROP;\nINSERT INTO _approval_scope (kc_id,version_id,snapshot_source)\nSELECT kc.kc_id,kc.current_version_id,'course_component:'||min(component.component_id::text)\nFROM alpha.course_component_member member\nJOIN alpha.course_component component ON component.tenant_id=member.tenant_id AND component.component_id=member.target_component_id AND component.retired_at IS NULL\nCROSS JOIN LATERAL unnest(component.scope_kc_ids) scoped(kc_id)\nJOIN alpha.knowledge_component kc ON kc.tenant_id=component.tenant_id AND kc.kc_id=scoped.kc_id AND kc.retired_at IS NULL\nWHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.target_kind='course_component' AND member.retired_at IS NULL\nGROUP BY kc.kc_id,kc.current_version_id;\nDO $$ BEGIN\n  IF NOT EXISTS (SELECT 1 FROM _approval_scope) OR (SELECT count(*) FROM _approval_scope) <> (SELECT count(DISTINCT scoped.kc_id) FROM alpha.course_component_member member JOIN alpha.course_component component ON component.tenant_id=member.tenant_id AND component.component_id=member.target_component_id AND component.retired_at IS NULL CROSS JOIN LATERAL unnest(component.scope_kc_ids) scoped(kc_id) WHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.target_kind='course_component' AND member.retired_at IS NULL) THEN RAISE EXCEPTION 'curriculum:approval_snapshot_incomplete'; END IF;\nEND $$;\nINSERT INTO alpha.course_approval (tenant_id,approval_id,course_id,course_graph_sha256,approved_by,approved_at,provenance) VALUES (:tenant_id,:approval_id,:course_id,:course_graph_sha256,:approved_by,now(),:provenance);\nINSERT INTO alpha.course_approval_kc_snapshot (tenant_id,approval_id,kc_id,version_id,snapshot_source,created_at) SELECT :tenant_id,:approval_id,kc_id,version_id,snapshot_source,now() FROM _approval_scope;\nDO $$ BEGIN IF (SELECT count(*) FROM _approval_scope) <> (SELECT count(*) FROM alpha.course_approval_kc_snapshot WHERE tenant_id=:tenant_id AND approval_id=:approval_id) THEN RAISE EXCEPTION 'curriculum:approval_snapshot_incomplete'; END IF; END $$;\nINSERT INTO alpha.kc_firming_event (tenant_id,firming_event_id,version_id,firming_reason,source_ref,actor_ref,firmed_at) SELECT :tenant_id,gen_random_uuid(),snapshot.version_id,'course_approval','approval:'||:approval_id,:approved_by,now() FROM alpha.course_approval_kc_snapshot snapshot JOIN alpha.knowledge_component_version version ON version.tenant_id=snapshot.tenant_id AND version.version_id=snapshot.version_id WHERE snapshot.tenant_id=:tenant_id AND snapshot.approval_id=:approval_id AND version.status='draft' ON CONFLICT (tenant_id,version_id) DO NOTHING;\nUPDATE alpha.knowledge_component_version version SET status='firm' FROM alpha.course_approval_kc_snapshot snapshot WHERE snapshot.tenant_id=:tenant_id AND snapshot.approval_id=:approval_id AND version.tenant_id=snapshot.tenant_id AND version.version_id=snapshot.version_id AND version.status='draft';\nUPDATE alpha.course SET current_approval_id=:approval_id,updated_at=now() WHERE tenant_id=:tenant_id AND course_id=:course_id;\nCOMMIT;",
      "guardrails": [
        "Complete immutable snapshot",
        "Firm only exact snapshotted versions",
        "No publication/assignment firming",
        "Approval and firming atomic"
      ],
      "problems": [
        "curriculum:approval_snapshot_incomplete",
        "curriculum:invalid_kc_lifecycle",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_kc_storage_governance",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
      }
    },
    {
      "id": "live-learning-firm",
      "title": "Firm a draft KC version on the first genuine live response",
      "api": "POST /alpha/curriculum/v1/kc-firming-events with Idempotency-Key and body {version_id, firming_reason:'first_genuine_response', source_ref}",
      "rawSql": "-- First obtain :validated_live_learning_evidence_ref from the Results/Events-owned contract; Curriculum rows cannot prove genuine traffic.\nBEGIN ISOLATION LEVEL SERIALIZABLE;\nSELECT status FROM alpha.knowledge_component_version WHERE tenant_id=:tenant_id AND version_id=:version_id FOR UPDATE;\nINSERT INTO alpha.kc_firming_event (tenant_id,firming_event_id,version_id,firming_reason,source_ref,actor_ref,firmed_at) VALUES (:tenant_id,:event_id,:version_id,'first_genuine_response',:validated_live_learning_evidence_ref,:actor_ref,now()) ON CONFLICT (tenant_id,version_id) DO NOTHING;\nUPDATE alpha.knowledge_component_version SET status='firm' WHERE tenant_id=:tenant_id AND version_id=:version_id AND status='draft' AND EXISTS (SELECT 1 FROM alpha.kc_firming_event WHERE tenant_id=:tenant_id AND version_id=:version_id AND firming_reason='first_genuine_response' AND source_ref=:validated_live_learning_evidence_ref);\nCOMMIT;",
      "guardrails": [
        "Explicit live_learning=true",
        "First genuine response evidence",
        "Preview/developer traffic rejected",
        "At most one effective firming event",
        "Idempotent replay"
      ],
      "problems": [
        "curriculum:invalid_kc_lifecycle",
        "curriculum:live_learning_evidence_required",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_kc_storage_governance",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-020-kc-storage-governance"
      }
    },
    {
      "id": "reuse-component-members",
      "title": "Reuse one lesson in two courses with independent order and behavior",
      "api": "POST /alpha/curriculum/v1/components; POST /alpha/curriculum/v1/courses/{courseId}/members (once per course)",
      "rawSql": "BEGIN;\nINSERT INTO alpha.course_component (tenant_id,component_id,kind,scope_kc_ids,name,description,expected_xp,lineage_id,publication_status,created_at,updated_at) VALUES (:tenant_id,:component_id,'lesson',ARRAY[:kc_id]::uuid[],:component_name,:component_description,:expected_xp,:lineage_id,'published',now(),now());\nINSERT INTO alpha.course_component_member (tenant_id,member_id,course_id,parent_component_id,position,target_kind,target_component_id,content_id,content_version_id,content_kind,renderer_ref,gates,passing_criteria_ref,on_fail,created_at,updated_at) VALUES\n(:tenant_id,:course_a_member_id,:course_a_id,:course_a_parent_id,:course_a_position,'course_component',:component_id,NULL,NULL,NULL,NULL,false,NULL,NULL,now(),now()),\n(:tenant_id,:course_b_member_id,:course_b_id,:course_b_parent_id,:course_b_position,'course_component',:component_id,NULL,NULL,NULL,NULL,false,NULL,NULL,now(),now());\nCOMMIT;",
      "guardrails": [
        "One component identity",
        "Two member identities",
        "Order/renderer/gate are member-local",
        "Lesson preserves its non-empty active KC cluster"
      ],
      "problems": [
        "curriculum:unknown_kc",
        "curriculum:invalid_component_kind",
        "curriculum:member_position_conflict"
      ],
      "trace": {
        "decision": "curriculum_reusable_component_member_model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
      }
    },
    {
      "id": "exact-content-member",
      "title": "Create a member that targets one eligible exact Content version",
      "api": "GET Content exact-version release-eligibility; POST /alpha/curriculum/v1/courses/{courseId}/members",
      "rawSql": "-- First require a 200 eligible response from GET /tenants/{tenantId}/alpha/content/items/{contentId}/versions/{contentVersionId}/release-eligibility and verify renderer_ref against the live capability registry. Raw Curriculum rows cannot infer either verdict.\nINSERT INTO alpha.course_component_member (tenant_id,member_id,course_id,parent_component_id,position,target_kind,target_component_id,content_id,content_version_id,content_kind,renderer_ref,gates,passing_criteria_ref,on_fail,created_at,updated_at)\nVALUES (:tenant_id,:member_id,:course_id,:parent_component_id,:position,'content_version',NULL,:validated_content_id,:validated_content_version_id,:validated_content_kind,:validated_renderer_ref,:gates,:passing_criteria_ref,:on_fail,now(),now());",
      "guardrails": [
        "Exact version, not latest",
        "Content owns eligibility",
        "No copied eligibility fields",
        "Renderer registry must accept content_kind",
        "404/unsupported fails closed"
      ],
      "problems": [
        "curriculum:content_not_eligible",
        "curriculum:content_unavailable",
        "curriculum:content_version_mismatch",
        "curriculum:invalid_content_bank_member_contract",
        "curriculum:renderer_incompatible"
      ],
      "trace": {
        "decision": "curriculum_member_content_reference_gate_placement",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
      }
    },
    {
      "id": "producer-repoint-attach",
      "title": "Producer self-service repoint/attach of one exact Content pin",
      "api": "POST /alpha/curriculum/v1/components/{componentId}/repoint with Idempotency-Key",
      "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 curriculum:write credential; a platform re-pin ticket is not the steady-state path. operation=attach pins newly published content onto a component without a current pin. This endpoint exposes the same governed exact-version target update the platform's own repin corridor executes; it is not a new storage primitive.",
      "requestBody": "{\"operation\":\"repoint\",\"expected_target_ref\":{\"module\":\"content\",\"content_kind\":\"article\",\"content_id\":\"{contentId}\",\"content_version_id\":\"{currentlyPinnedVersionId}\"},\"target_ref\":{\"module\":\"content\",\"content_kind\":\"article\",\"content_id\":\"{contentId}\",\"content_version_id\":\"{amendedVersionId}\"}}",
      "preconditions": [
        "expected_target_ref is a compare-and-set premise: it must equal the component's exact current pin (attach requires null and an unpinned component); any drift is 409 curriculum:repoint_pin_stale with zero writes.",
        "A repoint keeps the Content identity: content_id and content_kind never change; a revision published under a new content_id is a NEW content identity and must be attached, never silently substituted (409 curriculum:repoint_identity_mismatch).",
        "The exact new version must pass Content-owned release eligibility with practice_eligible usage scope inside the accepting request; an authoritative refusal is 409 curriculum:repoint_target_not_serveable carrying the safe upstream cause, and an unavailable Content answer stays 503 curriculum:content_unavailable.",
        "A published component pinning an assessment chain (mastery_gate/quiz/test kinds, or test_bank/test/test_spec content kinds) is frozen: producer self-service returns 409 curriculum:approved_chain_repoint_frozen and the change goes through the reviewed-replacement manifest path — a committed reviewed manifest applied through the platform's dry-run-first ETag/CAS corridor.",
        "The component resolves only inside the verified JWT tenant; a cross-tenant id is an ordinary 404."
      ],
      "readback": [
        "The 200 response returns the updated component plus its immutable alpha.component_target_repoint_audit row; the same Idempotency-Key replays the identical response with no second audit row.",
        "The repoint changes the course graph, so next-lesson fails closed (409 curriculum:course_not_routable) until the producer appends a new immutable approval through POST /alpha/curriculum/v1/courses/{courseId}/approvals; ordinary next-lesson must then echo the new approval and serve the exact repointed version."
      ],
      "rawSql": "BEGIN;\n-- First require a 200 exact-version release-eligibility response with usage_scope='practice_eligible'\n-- for :new_content_version_id from the owning Content API; raw Curriculum rows cannot infer that verdict.\nSELECT member_id, content_id, content_version_id, content_kind, gates\n  FROM alpha.course_component_member\n WHERE tenant_id=:tenant_id AND member_id=:member_id AND retired_at IS NULL\n FOR UPDATE;\nDO $$ BEGIN\n  IF NOT FOUND THEN RAISE EXCEPTION 'curriculum:not_found'; END IF;\nEND $$;\nUPDATE alpha.course_component_member member\n   SET content_version_id=:new_content_version_id, updated_at=now()\n WHERE member.tenant_id=:tenant_id AND member.member_id=:member_id AND member.retired_at IS NULL\n   AND member.target_kind='content_version'\n   AND member.gates=false\n   AND member.content_kind NOT IN ('test_bank','test','test_spec')\n   AND member.content_id=:expected_content_id\n   AND member.content_kind=:expected_content_kind\n   AND member.content_version_id IS NOT DISTINCT FROM :expected_content_version_id\n   AND member.content_id=:new_content_id;\nDO $$ BEGIN\n  IF NOT EXISTS (SELECT 1 FROM alpha.course_component_member WHERE tenant_id=:tenant_id AND member_id=:member_id AND content_version_id=:new_content_version_id) THEN\n    RAISE EXCEPTION 'curriculum:repoint_pin_stale';\n  END IF;\nEND $$;\nINSERT INTO alpha.component_target_repoint_audit (tenant_id, repoint_audit_id, component_id, operation, previous_target_ref, new_target_ref, actor_ref, request_id, created_at)\nVALUES (:tenant_id, :repoint_audit_id, :member_id, :operation, :previous_target_ref, :new_target_ref, :actor_ref, :request_id, now());\nCOMMIT;\n-- The deployed CASE compatibility adapter performs the identical operation on the component's\n-- alpha.target_ref through the same normalized patch and CAS-guarded persistence as component PATCH.",
      "guardrails": [
        "Compare-and-set on the exact current pin, never last-writer-wins",
        "One Content identity per repoint; attach only onto an unpinned component",
        "Content owns exact-version eligibility and the check happens server-side inside the accepting request",
        "Approved assessment chains freeze to the reviewed-replacement manifest path",
        "One immutable audit row per accepted operation in the same transaction",
        "Idempotency-Key replay returns the stored response without a second audit row",
        "Routing stays fail-closed until a new immutable course approval covers the changed graph"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:repoint_pin_stale",
        "curriculum:repoint_identity_mismatch",
        "curriculum:repoint_target_not_serveable",
        "curriculum:approved_chain_repoint_frozen",
        "curriculum:content_unavailable",
        "curriculum:content_version_mismatch",
        "curriculum:renderer_incompatible",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_member_content_reference_gate_placement",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-005-member-targets-renderers-and-gates"
      }
    },
    {
      "id": "expected-xp-main-total",
      "title": "Compute any course's expected XP without double-counting fallbacks",
      "api": "GET /alpha/curriculum/v1/courses/{courseId}/expected-xp",
      "rawSql": "WITH RECURSIVE active_tree AS (\n  SELECT member.tenant_id,member.course_id,member.member_id,member.target_component_id,component.expected_xp,ARRAY[member.member_id]::uuid[] AS member_path\n  FROM alpha.course_component_member member JOIN alpha.course_component component ON component.tenant_id=member.tenant_id AND component.component_id=member.target_component_id AND component.retired_at IS NULL\n  WHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.parent_component_id IS NULL AND member.target_kind='course_component' AND member.retired_at IS NULL\n  UNION ALL\n  SELECT child.tenant_id,child.course_id,child.member_id,child.target_component_id,component.expected_xp,parent.member_path||child.member_id\n  FROM active_tree parent JOIN alpha.course_component_member child ON child.tenant_id=parent.tenant_id AND child.course_id=parent.course_id AND child.parent_component_id=parent.target_component_id AND child.target_kind='course_component' AND child.retired_at IS NULL\n  JOIN alpha.course_component component ON component.tenant_id=child.tenant_id AND component.component_id=child.target_component_id AND component.retired_at IS NULL\n  WHERE NOT child.member_id=ANY(parent.member_path)\n), contributing AS (\n  SELECT node.* FROM active_tree node WHERE node.expected_xp IS NOT NULL AND NOT EXISTS (SELECT 1 FROM active_tree descendant WHERE cardinality(descendant.member_path)>cardinality(node.member_path) AND descendant.member_path[1:cardinality(node.member_path)]=node.member_path AND descendant.expected_xp IS NOT NULL)\n), cycle_check AS (\n  SELECT EXISTS (SELECT 1 FROM active_tree parent JOIN alpha.course_component_member child ON child.tenant_id=parent.tenant_id AND child.course_id=parent.course_id AND child.parent_component_id=parent.target_component_id AND child.retired_at IS NULL WHERE child.member_id=ANY(parent.member_path)) AS cycle_detected\n)\nSELECT CASE WHEN cycle_check.cycle_detected THEN NULL ELSE COALESCE(sum(contributing.expected_xp),0) END AS expected_xp,course.course_role,(course.course_role='main') AS included_in_results_grade_denominator,cycle_check.cycle_detected\nFROM cycle_check JOIN alpha.course course ON course.tenant_id=:tenant_id AND course.course_id=:course_id AND course.retired_at IS NULL LEFT JOIN contributing ON true\nGROUP BY course.course_role,cycle_check.cycle_detected;",
      "guardrails": [
        "Every active course role returns its own total",
        "Container ignored when descendant has expected_xp",
        "Fallback contributes only without valued descendant",
        "Active member paths only",
        "Main role only for the separate Results grade denominator",
        "No student actuals"
      ],
      "problems": [
        "curriculum:lesson_structure_missing",
        "curriculum:expected_xp_ambiguous"
      ],
      "trace": {
        "decision": "curriculum_reusable_component_member_model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-003-reusable-components-and-members"
      }
    },
    {
      "id": "timeback-source-ingest",
      "title": "Import source-shaped TimeBack course structure without fabricating pedagogy",
      "api": "POST /alpha/curriculum/v1/ingest/timeback-course-refs with Idempotency-Key",
      "rawSql": "BEGIN;\nCREATE TEMP TABLE _source_components (source_component_id uuid PRIMARY KEY,source_kind text NOT NULL,scope_kc_ids uuid[] NOT NULL,source_name text NOT NULL,expected_xp numeric,lineage_id uuid NOT NULL) ON COMMIT DROP;\nINSERT INTO _source_components SELECT * FROM jsonb_to_recordset(:validated_source_components::jsonb) AS source(source_component_id uuid,source_kind text,scope_kc_ids uuid[],source_name text,expected_xp numeric,lineage_id uuid);\nCREATE TEMP TABLE _ordered_members (member_id uuid PRIMARY KEY,parent_component_id uuid,source_position integer NOT NULL,target_kind text NOT NULL,target_component_id uuid,content_id uuid,content_version_id uuid,content_kind text,renderer_ref text,gates boolean NOT NULL,passing_criteria_ref text,on_fail jsonb) ON COMMIT DROP;\nINSERT INTO _ordered_members SELECT * FROM jsonb_to_recordset(:validated_ordered_members::jsonb) AS member(member_id uuid,parent_component_id uuid,source_position integer,target_kind text,target_component_id uuid,content_id uuid,content_version_id uuid,content_kind text,renderer_ref text,gates boolean,passing_criteria_ref text,on_fail jsonb);\nDO $$ BEGIN\n  IF EXISTS (SELECT 1 FROM _source_components WHERE source_kind='lesson' AND cardinality(scope_kc_ids)=0) OR EXISTS (SELECT 1 FROM _source_components source CROSS JOIN LATERAL unnest(source.scope_kc_ids) scoped(kc_id) LEFT JOIN alpha.knowledge_component kc ON kc.tenant_id=:tenant_id AND kc.kc_id=scoped.kc_id AND kc.retired_at IS NULL WHERE kc.kc_id IS NULL) THEN RAISE EXCEPTION 'curriculum:adapter_rejected'; END IF;\n  IF EXISTS (SELECT 1 FROM _ordered_members WHERE source_position<0 OR target_kind NOT IN ('course_component','content_version') OR (target_kind='course_component' AND (target_component_id IS NULL OR content_id IS NOT NULL OR content_version_id IS NOT NULL OR content_kind IS NOT NULL)) OR (target_kind='content_version' AND (target_component_id IS NOT NULL OR content_id IS NULL OR content_version_id IS NULL OR content_kind IS NULL OR renderer_ref IS NULL)) OR gates<>(passing_criteria_ref IS NOT NULL)) THEN RAISE EXCEPTION 'curriculum:adapter_rejected'; END IF;\nEND $$;\nINSERT INTO alpha.course (tenant_id,course_id,subject_id,grade_scope,course_role,name,lineage_id,publication_status,created_at,updated_at) VALUES (:tenant_id,:course_id,:subject_id,:grade_scope,:course_role,:course_name,:course_lineage_id,'draft',now(),now()) ON CONFLICT (tenant_id,course_id) DO UPDATE SET subject_id=excluded.subject_id,grade_scope=excluded.grade_scope,course_role=excluded.course_role,name=excluded.name,lineage_id=excluded.lineage_id,publication_status='draft',updated_at=now();\nINSERT INTO alpha.course_component (tenant_id,component_id,kind,scope_kc_ids,name,expected_xp,lineage_id,publication_status,created_at,updated_at) SELECT :tenant_id,source_component_id,source_kind,scope_kc_ids,source_name,expected_xp,lineage_id,'draft',now(),now() FROM _source_components ON CONFLICT (tenant_id,component_id) DO UPDATE SET kind=excluded.kind,scope_kc_ids=excluded.scope_kc_ids,name=excluded.name,expected_xp=excluded.expected_xp,lineage_id=excluded.lineage_id,publication_status='draft',updated_at=now();\nINSERT INTO alpha.course_component_member (tenant_id,member_id,course_id,parent_component_id,position,target_kind,target_component_id,content_id,content_version_id,content_kind,renderer_ref,gates,passing_criteria_ref,on_fail,created_at,updated_at) SELECT :tenant_id,member_id,:course_id,parent_component_id,source_position,target_kind,target_component_id,content_id,content_version_id,content_kind,renderer_ref,gates,passing_criteria_ref,on_fail,now(),now() FROM _ordered_members ON CONFLICT (tenant_id,member_id) DO UPDATE SET course_id=excluded.course_id,parent_component_id=excluded.parent_component_id,position=excluded.position,target_kind=excluded.target_kind,target_component_id=excluded.target_component_id,content_id=excluded.content_id,content_version_id=excluded.content_version_id,content_kind=excluded.content_kind,renderer_ref=excluded.renderer_ref,gates=excluded.gates,passing_criteria_ref=excluded.passing_criteria_ref,on_fail=excluded.on_fail,updated_at=now();\nDO $$ BEGIN\n  IF (SELECT count(*) FROM _source_components) <> (SELECT count(*) FROM alpha.course_component component JOIN _source_components source ON source.source_component_id=component.component_id WHERE component.tenant_id=:tenant_id AND component.publication_status='draft') OR (SELECT count(*) FROM _ordered_members) <> (SELECT count(*) FROM alpha.course_component_member member JOIN _ordered_members source ON source.member_id=member.member_id WHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.retired_at IS NULL) THEN RAISE EXCEPTION 'curriculum:publication_incomplete'; END IF;\nEND $$;\nCREATE TEMP TABLE _intended_tree (component_id uuid PRIMARY KEY,depth integer NOT NULL) ON COMMIT DROP;\nWITH RECURSIVE intended_tree AS (\n  SELECT component.component_id,0 AS depth FROM alpha.course_component component JOIN alpha.course_component_member member ON member.tenant_id=component.tenant_id AND member.target_component_id=component.component_id WHERE component.tenant_id=:tenant_id AND member.course_id=:course_id AND member.parent_component_id IS NULL AND member.target_kind='course_component' AND member.retired_at IS NULL\n  UNION ALL\n  SELECT child.component_id,parent.depth+1 FROM intended_tree parent JOIN alpha.course_component_member member ON member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.parent_component_id=parent.component_id AND member.target_kind='course_component' AND member.retired_at IS NULL JOIN alpha.course_component child ON child.tenant_id=member.tenant_id AND child.component_id=member.target_component_id\n)\nINSERT INTO _intended_tree SELECT component_id,max(depth) FROM intended_tree GROUP BY component_id;\nDO $$ DECLARE publish_depth integer; BEGIN\n  FOR publish_depth IN SELECT DISTINCT depth FROM _intended_tree ORDER BY depth DESC LOOP\n    UPDATE alpha.course_component component SET publication_status='published',updated_at=now() FROM _intended_tree tree WHERE component.tenant_id=:tenant_id AND component.component_id=tree.component_id AND tree.depth=publish_depth;\n  END LOOP;\nEND $$;\nDO $$ BEGIN\n  IF NOT EXISTS (SELECT 1 FROM alpha.course_component_member member JOIN alpha.course_component component ON component.tenant_id=member.tenant_id AND component.component_id=member.target_component_id WHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND member.retired_at IS NULL AND component.kind IN ('lesson','review','practice','mastery_gate')) OR EXISTS (SELECT 1 FROM alpha.course_component_member member JOIN alpha.course_component component ON component.tenant_id=member.tenant_id AND component.component_id=member.target_component_id WHERE member.tenant_id=:tenant_id AND member.course_id=:course_id AND (member.retired_at IS NOT NULL OR component.retired_at IS NOT NULL OR component.publication_status<>'published')) THEN RAISE EXCEPTION 'curriculum:publication_incomplete'; END IF;\nEND $$;\nUPDATE alpha.course SET publication_status='published',updated_at=now() WHERE tenant_id=:tenant_id AND course_id=:course_id;\nCOMMIT;",
      "guardrails": [
        "Dry-run first",
        "Deterministic same-run upsert identities",
        "Every course/component is draft before assembly writes",
        "Exact intended-tree readback precedes publication",
        "Publish descendants bottom-up and the course root last",
        "Any write/readback/publish failure rolls back or leaves the root draft",
        "Preserve source parentage and order",
        "Content resolves resource bodies first and returns the exact version",
        "Never infer latest or copy Content eligibility evidence",
        "Exact Content release eligibility is required at authoring and launch",
        "Every lesson has a non-empty active KC cluster and multi-KC scope is preserved",
        "Standards evidence returns curriculum:adapter_rejected and never writes CASE rows",
        "Quiz label alone does not create a gate",
        "Source-empty anchors stay non-routable"
      ],
      "problems": [
        "curriculum:validation_failed",
        "curriculum:adapter_rejected",
        "curriculum:lesson_structure_missing",
        "curriculum:publication_incomplete",
        "curriculum:content_not_eligible",
        "curriculum:content_unavailable",
        "curriculum:content_version_mismatch",
        "curriculum:invalid_content_bank_member_contract",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_source_shaped_ingest_adapter",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-008-source-shaped-ingest"
      }
    },
    {
      "id": "placement-candidates",
      "title": "Resolve placement candidates from a versioned Policy reference",
      "api": "GET /alpha/curriculum/v1/tracks/{trackId}/placement-candidates?studentId=:student_id&subjectId=:subject_id",
      "rawSql": "SELECT m.member_id,m.position,m.target_component_id,c.entry_policy_ref FROM alpha.course c JOIN alpha.course_component_member m ON m.tenant_id=c.tenant_id AND m.course_id=c.course_id AND m.retired_at IS NULL WHERE c.tenant_id=:tenant_id AND c.course_id=:track_id AND c.retired_at IS NULL ORDER BY m.position,m.member_id; -- Apply the returned versioned entry_policy_ref through Policy/Results; MAP/RIT may seed the start only.",
      "guardrails": [
        "Tenant scope",
        "Active ordered members",
        "Policy owns the algorithm/numbers",
        "MAP/RIT is not final placement",
        "Student state stays in Results"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:reference_unresolved",
        "curriculum:unsupported_query_parameter"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "next-lesson-route",
      "title": "Route to the next active instructional member",
      "api": "GET /alpha/curriculum/v1/courses/{courseId}/next-lesson?studentId=:student_id&subjectId=:subject_id",
      "rawSql": "WITH RECURSIVE course_root AS (\n  SELECT course_id,publication_status,retired_at FROM alpha.course WHERE tenant_id=:tenant_id AND course_id=:course_id\n), tree AS (\n  SELECT m.tenant_id,m.course_id,m.member_id,m.parent_component_id,m.position,m.target_kind,m.target_component_id,ARRAY[m.position]::integer[] AS position_path,ARRAY[m.member_id]::uuid[] AS member_path,(m.retired_at IS NULL AND component.publication_status='published' AND component.retired_at IS NULL) AS ancestor_publication_safe\n  FROM alpha.course_component_member m JOIN alpha.course_component component ON component.tenant_id=m.tenant_id AND component.component_id=m.target_component_id\n  WHERE m.tenant_id=:tenant_id AND m.course_id=:course_id AND m.parent_component_id IS NULL AND m.target_kind='course_component'\n  UNION ALL\n  SELECT child.tenant_id,child.course_id,child.member_id,child.parent_component_id,child.position,child.target_kind,child.target_component_id,parent.position_path||child.position,parent.member_path||child.member_id,(parent.ancestor_publication_safe AND child.retired_at IS NULL AND component.publication_status='published' AND component.retired_at IS NULL)\n  FROM alpha.course_component_member child JOIN tree parent ON child.tenant_id=parent.tenant_id AND child.course_id=parent.course_id AND child.parent_component_id=parent.target_component_id JOIN alpha.course_component component ON component.tenant_id=child.tenant_id AND component.component_id=child.target_component_id\n  WHERE child.target_kind='course_component' AND NOT child.member_id=ANY(parent.member_path)\n), first_frontier AS (\n  SELECT tree.member_id,tree.position,tree.position_path,tree.target_component_id,component.kind,component.scope_kc_ids,component.kc_scope_decision,tree.ancestor_publication_safe\n  FROM tree JOIN alpha.course_component component ON component.tenant_id=tree.tenant_id AND component.component_id=tree.target_component_id\n  WHERE component.kind IN ('lesson','review','practice','mastery_gate') ORDER BY tree.position_path,tree.member_id LIMIT 1\n)\nSELECT frontier.member_id,frontier.position,frontier.position_path,frontier.target_component_id,frontier.kind,frontier.scope_kc_ids,frontier.kc_scope_decision\nFROM course_root root CROSS JOIN first_frontier frontier\nWHERE root.publication_status='published' AND root.retired_at IS NULL AND frontier.ancestor_publication_safe;\n-- Results supplies completed/current state; choose the first eligible row there, never in Curriculum storage.",
      "guardrails": [
        "Tenant + active-row predicates",
        "Choose the first frontier before publication filtering so an unpublished node is never skipped",
        "Course root, selected frontier, and every containment ancestor must be published and not retired",
        "Current graph must match an immutable approval with a complete exact firm KC-version snapshot for every scoped KC",
        "The exact Content target is revalidated through Content-owned release eligibility at launch and latest is never substituted",
        "Draft, retired, changed, unapproved, incomplete, unavailable, malformed, mismatched, or ineligible state fails closed",
        "Lexicographic ancestor position_path preserves sibling-local hierarchy order",
        "Cycle paths are rejected",
        "An ordinary lesson has a non-empty active KC cluster and preserves multi-KC scope; an exact content-bearing lesson may instead echo scope_kc_ids=[] plus kc_scope_decision=authoritative_no_kc and contributes no KC snapshot or mastery evidence",
        "Results supplies student state",
        "Missing authoritative members fails closed"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:lesson_structure_missing",
        "curriculum:course_not_routable",
        "curriculum:content_not_eligible",
        "curriculum:content_unavailable",
        "curriculum:content_version_mismatch",
        "curriculum:invalid_content_bank_member_contract",
        "curriculum:unsupported_query_parameter"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "gate-status-remediation",
      "title": "Read a gate contract and typed remediation without client classification",
      "api": "GET /alpha/curriculum/v1/gates/{gateId}/status?studentId=:student_id; GET /alpha/curriculum/v1/gates/{gateId}/remediation?studentId=:student_id&resultRecordId=:result_id",
      "rawSql": "SELECT m.member_id,m.passing_criteria_ref,m.on_fail,m.content_id,m.content_version_id,m.content_kind FROM alpha.course_component_member m WHERE m.tenant_id=:tenant_id AND m.member_id=:gate_id AND m.gates=true AND m.retired_at IS NULL; -- Resolve passing_criteria_ref through Policy and result_id through Results. Return on_fail entries exactly; never persist the student's inserted remediation path in Curriculum.",
      "guardrails": [
        "Gate behavior is member-local",
        "Policy numbers are referenced",
        "Results outcomes are read, not copied",
        "never_learned→lesson",
        "forgot→review",
        "careless→practice"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:invalid_gate_contract",
        "curriculum:reference_unresolved"
      ],
      "trace": {
        "decision": "curriculum_five_use_cases",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-006-author-place-route-gate-remediate"
      }
    },
    {
      "id": "gate-next-form",
      "title": "Select the lowest-index unseen eligible form for a fixed-form gate",
      "api": "GET /alpha/curriculum/v1/gates/{gateId}/next-form?studentId=:student_id",
      "rawSql": "WITH base_gate AS (\n  SELECT content_id,content_version_id FROM alpha.course_component_member WHERE tenant_id=:tenant_id AND member_id=:gate_id AND gates=true AND content_kind='test_bank' AND retired_at IS NULL\n), content_eligible_versions AS (\n  -- Populate from 200 ordinary exact-version release-eligibility responses, or for one Content-authorized\n  -- demo test identity from current test-serve eligibility responses. Test mode returns only after\n  -- Content appends the exact bank/form authorization receipt.\n  SELECT content_id,content_version_id FROM jsonb_to_recordset(:validated_content_eligible_versions::jsonb) AS eligible(content_id text,content_version_id text)\n), eligible_gate AS (\n  SELECT gate.* FROM base_gate gate JOIN content_eligible_versions eligible ON eligible.content_id=gate.content_id::text AND eligible.content_version_id=gate.content_version_id::text\n), raw_bank_members AS (\n  -- Read every active row for the exact bank version before applying scope or eligibility filters.\n  -- LEFT JOINs keep missing targets visible so malformed legacy rows cannot disappear.\n  SELECT r.content_reference_id,r.referenced_content_artifact_id AS referenced_content_id,\n         r.referenced_content_version_id AS referenced_version_id,r.form_index,r.usage_scope,\n         referenced_ext.usage_scope AS referenced_usage_scope,\n         CASE referenced_artifact.artifact_kind WHEN 'test' THEN 'test' WHEN 'item' THEN 'question' ELSE NULL END AS content_kind,\n         referenced_test.assessment_role\n  FROM alpha.content_reference r\n  JOIN platform.tenant tenant ON tenant.tenant_id=r.tenant_id\n  JOIN eligible_gate gate ON r.parent_content_artifact_id=gate.content_id AND r.parent_content_version_id=gate.content_version_id\n  LEFT JOIN qti.artifact referenced_artifact ON referenced_artifact.tenant_id=r.tenant_id AND referenced_artifact.artifact_id=r.referenced_content_artifact_id\n  LEFT JOIN alpha.content_item_extension referenced_ext ON referenced_ext.tenant_id=r.tenant_id AND referenced_ext.content_artifact_id=r.referenced_content_artifact_id\n  LEFT JOIN alpha.assessment_test_extension referenced_test ON referenced_test.tenant_id=r.tenant_id AND referenced_test.content_artifact_id=r.referenced_content_artifact_id\n  WHERE tenant.tenant_key=:tenant_key AND r.relationship_kind='bank_member' AND r.retired_at IS NULL\n  ORDER BY r.form_index ASC NULLS LAST,r.content_reference_id\n  LIMIT 51\n), bank_member_contract AS (\n  SELECT count(*) AS member_count,\n         count(*) FILTER (WHERE content_kind IS DISTINCT FROM 'test' OR assessment_role IS DISTINCT FROM 'form' OR referenced_content_id IS NULL OR referenced_version_id IS NULL OR form_index IS NULL OR form_index<=0) AS malformed_count,\n         count(form_index)-count(DISTINCT form_index) AS duplicate_form_index_count\n  FROM raw_bank_members\n), candidate_forms AS (\n  SELECT member.referenced_content_id,member.referenced_version_id,member.form_index\n  FROM raw_bank_members member CROSS JOIN bank_member_contract contract\n  WHERE contract.malformed_count=0 AND contract.duplicate_form_index_count=0\n    AND member.usage_scope='practice_eligible' AND member.referenced_usage_scope='practice_eligible'\n), eligible_forms AS (\n  SELECT candidate.* FROM candidate_forms candidate JOIN content_eligible_versions eligible ON eligible.content_id=candidate.referenced_content_id AND eligible.content_version_id=candidate.referenced_version_id\n), seen_forms AS (\n  SELECT data->>'content_id' AS content_id,data->>'content_version_id' AS content_version_id\n  FROM alpha.result_content_evidence\n  WHERE tenant_id=:tenant_key AND data->>'student_id'=:student_id\n), unseen_forms AS (\n  SELECT form.* FROM eligible_forms form LEFT JOIN seen_forms seen ON seen.content_id=form.referenced_content_id AND seen.content_version_id=form.referenced_version_id WHERE seen.content_id IS NULL\n), next_form AS (\n  SELECT * FROM unseen_forms ORDER BY form_index,referenced_content_id LIMIT 1\n)\nSELECT (SELECT count(*) FROM base_gate) AS gate_count,(SELECT count(*) FROM eligible_gate) AS eligible_gate_count,contract.member_count,contract.malformed_count,contract.duplicate_form_index_count,(SELECT count(*) FROM candidate_forms) AS candidate_count,(SELECT count(*) FROM eligible_forms) AS eligible_count,(SELECT count(*) FROM unseen_forms) AS unseen_count,next_form.referenced_content_id,next_form.referenced_version_id,next_form.form_index\nFROM bank_member_contract contract LEFT JOIN next_form ON true;\n-- Before scope filtering or form eligibility, map malformed_count>0 or duplicate_form_index_count>0 to curriculum:invalid_content_bank_member_contract. Map gate_count=0 to curriculum:not_found, eligible_gate_count=0 to curriculum:content_not_eligible, member_count=0 or >50 to curriculum:invalid_gate_contract, eligible_count=0 to curriculum:content_not_eligible, and eligible_count>0 plus unseen_count=0 to curriculum:bank_exhausted. Never synthesize form_index from display_order or row position, and never return an empty 200.",
      "guardrails": [
        "PP100 v2 gates reject this fixed-form route because Results owns adaptive question selection from the exact pp100_adaptive_shards bank",
        "Targetless drafts fail before Content and membership reads",
        "A complete exact-bank draft is limited to Content's demo grant plus live People & Orgs test/synthetic reality",
        "Published gates try ordinary release eligibility first; only authoritative ineligibility can enter test-serve",
        "Content invalid-bank contract answers map to the typed Curriculum 409 and never enter test-serve, appear empty, or skip",
        "Transport, timeout, malformed, and target-mismatch outcomes fail closed",
        "Content owns exact-version bank membership",
        "Read and validate every active exact-bank row before applying usage-scope or eligibility filters",
        "Each member must be an exact assessment_role=form test with a unique positive integer form_index",
        "Never coalesce or synthesize form_index from display_order or row position",
        "Pin parent_content_id + parent_version_id",
        "The bank version and every candidate form version must each pass the selected Content eligibility lane",
        "Test mode commits an immutable exact bank/form Content receipt before return",
        "Both Content usage scopes must be practice_eligible",
        "Results owns seen-form evidence",
        "Stable ascending form_index",
        "Never client-chosen or header-enabled",
        "Missing, ineligible, malformed, invalid-bank, and exhausted are distinct"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:invalid_gate_contract",
        "curriculum:content_not_eligible",
        "curriculum:content_unavailable",
        "curriculum:invalid_content_bank_member_contract",
        "curriculum:bank_exhausted"
      ],
      "trace": {
        "decision": "curriculum_mastery_gate_test_bank_reference",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-013-mastery-gate-test-bank-reference"
      }
    },
    {
      "id": "common-cartridge-round-trip",
      "title": "Preview or import a Common Cartridge without creating a second store",
      "api": "POST /alpha/curriculum/v1/transports/common-cartridge/preview; POST /alpha/curriculum/v1/transports/common-cartridge/import with Idempotency-Key",
      "rawSql": "SELECT c.course_id,m.member_id,m.position,m.target_kind,m.target_component_id,m.content_id,m.content_version_id FROM alpha.course c JOIN alpha.course_component_member m ON m.tenant_id=c.tenant_id AND m.course_id=c.course_id AND m.retired_at IS NULL WHERE c.tenant_id=:tenant_id AND c.course_id=:course_id AND c.retired_at IS NULL ORDER BY m.position,m.member_id; -- Join CASE standards and Content package bytes through their owning dictionaries to build/validate the transport; do not INSERT a cartridge authority row.",
      "guardrails": [
        "Transport only",
        "No stored cartridge authority",
        "Stable identifiers",
        "CASE/Curriculum/Content owners remain separate",
        "Import is idempotent"
      ],
      "problems": [
        "curriculum:transport_invalid",
        "curriculum:reference_unresolved",
        "curriculum:idempotency_conflict"
      ],
      "trace": {
        "decision": "curriculum_common_cartridge_transport_only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-010-common-cartridge-and-external-consumers"
      }
    },
    {
      "id": "named-kc-set",
      "title": "Read a named KC-set projection",
      "api": "GET /alpha/curriculum/v1/kc-sets/{setId}",
      "rawSql": "SELECT set_id,set_kind,name,kc_id,version_id,ordinal,source_ref FROM alpha.named_kc_set_v WHERE tenant_id=:tenant_id AND set_id=:set_id ORDER BY ordinal NULLS LAST,kc_id;",
      "guardrails": [
        "Read-only",
        "Deterministic source projection",
        "No stored KC parent/tree",
        "Set membership does not imply prerequisite order"
      ],
      "problems": [
        "curriculum:not_found",
        "curriculum:unsupported_query_parameter"
      ],
      "trace": {
        "decision": "curriculum_kc_registry_standard_separation",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
      }
    },
    {
      "id": "kc-corpus-discovery",
      "title": "Discover the adaptive-eligible KC corpus from the owning registry",
      "api": "GET /alpha/curriculum/v1/kcs; GET /alpha/curriculum/v1/kcs/{kcId}",
      "rawSql": "SELECT kc.kc_id,kc.lineage_id,kc.kc_kind,kc.subject_id,kc.current_version_id,kc.publication_status,version.version_number,version.status,version.definition FROM alpha.knowledge_component kc JOIN alpha.knowledge_component_version version ON version.tenant_id=kc.tenant_id AND version.version_id=kc.current_version_id WHERE kc.tenant_id=:tenant_id AND kc.retired_at IS NULL AND kc.current_version_id IS NOT NULL ORDER BY kc.updated_at DESC,kc.kc_id LIMIT :limit;",
      "guardrails": [
        "The registry is the single KC owner: adaptive-diagnostics consumers (for example AlphaTest adaptive_diagnostic blueprints) discover Knowledge Components here, never from case.cf_item or a CASE package, and no KC row is ever copied or relabeled into the standards catalog",
        "Adaptive-eligible means an active owner-typed registry KC: retired rows and the retained unclassified #707 legacy adoption row (kc_kind NULL, no current version) are never discoverable and never adaptive-eligible",
        "Every returned identity is the canonical kc_id UUID and reads back through GET /alpha/curriculum/v1/kcs/{kcId}; superseded legacy CASE KC rows remain immutable migration evidence only",
        "CASE package/framework identity for standards remains the contained CFDocument.identifier per official CASE 1.1; KC discovery never mints a CASE package identity",
        "Stable updated_at desc, kc_id asc order with an opaque server-issued cursor; unsupported query parameters and malformed cursors fail closed"
      ],
      "problems": [
        "curriculum:unsupported_query_parameter",
        "curriculum:validation_failed"
      ],
      "trace": {
        "decision": "curriculum_kc_registry_standard_separation",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/curriculum/alpha/architecture/#caitd-004-kc-registry-and-standards"
      }
    }
  ],
  "endpointRules": [
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/standards-frameworks/import",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "bounded serializable import",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standards-frameworks",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "stable list read with typed filters/cursor or inherited CASE offset",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standards-frameworks/{frameworkId}",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "detail read with immutable source-release links",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standards-source-releases",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "immutable created-at cursor list",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standards-source-releases/{sourceReleaseId}",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standards-source-releases/{sourceReleaseId}/readback",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read",
      "immutable": true
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kcs",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "identity ETag after create; optional source_kc_id is tenant-unique provenance, never an active alias",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kcs",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "tenant-isolated stable updated_at/kc_id cursor list of active registry KCs with their current immutable versions; typed subject_id/kc_kind/publication_status/updated_since filters; rows carry the same current-version readback as GET /kcs/{kcId}; retired rows and the retained unclassified #707 legacy row (no current version) are never listed",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kcs/{kcId}",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "exact registry UUID read of current immutable version with ETag",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kcs/{kcId}/versions",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "append only",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kcs/{kcId}/versions",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "immutable version-number cursor list",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kcs/{kcId}/versions/{versionId}",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "read",
      "immutable": true
    },
    {
      "method": "PATCH",
      "path": "/alpha/curriculum/v1/kcs/{kcId}",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "If-Match required",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/kcs/{kcId}",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "If-Match; soft retire only; friendly active-reference precheck plus native content_kc_tag_active_kc_fk commit invariant; active Curriculum references and active Content tags return curriculum:resource_referenced, while serialization conflicts retry",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-prerequisites",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "stable cursor list; registry UUID endpoint filters",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kc-prerequisites",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "tenant graph lock inside SERIALIZABLE; registry UUID endpoints only",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/kc-prerequisites/{prerequisiteId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; soft retire",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-relations",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "stable cursor list; kc/relation_type filters",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kc-relations",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match on edge corrections",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/kc-relations/{relationId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; soft retire",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-review-decisions",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "immutable decided-at cursor list",
      "immutable": true
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kc-review-decisions",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "append only",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-firming-events",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "immutable firmed-at cursor list",
      "immutable": true
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/kc-firming-events",
      "state": "authoritative governed implementation",
      "idempotency": true,
      "concurrency": "append only after governed first-genuine-response evidence; course approval creates its own events atomically",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/standard-kc-maps",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "tenant-isolated stable updated_at/map_id cursor list; typed source_release_id/standard_id/kc_id/relationship/updated_since filters; exact ten-field rows",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/standard-kc-maps",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "ETag after create",
      "immutable": false
    },
    {
      "method": "PATCH",
      "path": "/alpha/curriculum/v1/standard-kc-maps/{mapId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match required",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/standard-kc-maps/{mapId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; soft retire",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "stable cursor list; role/subject/status/updated_since filters",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/courses/{courseId}/approvals",
      "state": "authoritative governed implementation over the current CASE-backed course graph",
      "idempotency": true,
      "concurrency": "serializable complete graph snapshot and firming transaction",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}/approvals",
      "state": "authoritative governed implementation",
      "idempotency": false,
      "concurrency": "immutable approved-at cursor list",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/course-approvals/{approvalId}/kc-snapshot",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "immutable list",
      "immutable": true
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/courses",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "ETag after create",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read with ETag",
      "immutable": false
    },
    {
      "method": "PATCH",
      "path": "/alpha/curriculum/v1/courses/{courseId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match required",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/courses/{courseId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; soft retire only",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/components",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "stable cursor list; kind/subject/status/updated_since filters",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/components",
      "state": "deployed CASE compatibility; authoritative target pending cutover; kind=lesson permits scope_kc_refs=[] only with exact eligible Content target + compatible renderer + kc_scope_decision=authoritative_no_kc",
      "idempotency": true,
      "concurrency": "transactional insert-or-reactivate; same retired identity preserves created_at, advances CASE version, clears retired_at, returns active ETag",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/components/{componentId}",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read with ETag",
      "immutable": false
    },
    {
      "method": "PATCH",
      "path": "/alpha/curriculum/v1/components/{componentId}",
      "state": "deployed CASE compatibility plus authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match required; isolated parent_component_id + position reparent is one locked transaction and requires exactly one active parent",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/components/{componentId}/repoint",
      "state": "authoritative governed implementation over the current CASE-backed component graph",
      "idempotency": true,
      "concurrency": "expected_target_ref is a mandatory compare-and-set premise over the exact current pin (optional If-Match additionally honored); the pin move and its immutable audit row commit in one CAS-guarded transaction",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/components/{componentId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; active references block or atomically repoint",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}/members",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "stable ordered cursor list",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/courses/{courseId}/members",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match course graph",
      "immutable": false
    },
    {
      "method": "PATCH",
      "path": "/alpha/curriculum/v1/courses/{courseId}/members/{memberId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match course graph",
      "immutable": false
    },
    {
      "method": "DELETE",
      "path": "/alpha/curriculum/v1/courses/{courseId}/members/{memberId}",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "If-Match; soft retire",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}/tree",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "resolved identity-preserving read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}/expected-xp",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/courses/{courseId}/next-lesson",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "Results-assisted read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/tracks/{trackId}/placement-candidates",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "Policy/Results-assisted read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/gates",
      "state": "target contract pending cutover",
      "idempotency": false,
      "concurrency": "stable cursor list over resolved active gate members; course/policy/content-kind filters",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/gates/{gateId}",
      "state": "target contract pending cutover",
      "idempotency": false,
      "concurrency": "resolved gate contract detail without student state",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/gates/{gateId}/status",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "Policy/Results-assisted read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/gates/{gateId}/next-form",
      "state": "fixed-form gates only; PP100 v2 rejects because Results owns adaptive selection",
      "idempotency": false,
      "concurrency": "Content/Results-assisted deterministic read; test mode commits one Content authorization receipt",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/gates/{gateId}/remediation",
      "state": "target contract; same path currently serves CASE-backed compatibility",
      "idempotency": false,
      "concurrency": "Results-assisted read",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-sets",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "stable projection list",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/kc-sets/{setId}",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read-only projection",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/ingest/timeback-course-refs",
      "state": "target contract; same path currently writes CASE-backed compatibility",
      "idempotency": true,
      "concurrency": "bounded source-shaped import; shared containment lock rejects parent replacement or second-parent creation",
      "immutable": false
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/transports/common-cartridge/preview",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "side-effect-free deterministic preview",
      "immutable": true
    },
    {
      "method": "POST",
      "path": "/alpha/curriculum/v1/transports/common-cartridge/import",
      "state": "authoritative target pending cutover",
      "idempotency": true,
      "concurrency": "bounded transport import",
      "immutable": false
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/import-jobs",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "stable created-at cursor list",
      "immutable": true
    },
    {
      "method": "GET",
      "path": "/alpha/curriculum/v1/import-jobs/{importJobId}",
      "state": "authoritative target pending cutover",
      "idempotency": false,
      "concurrency": "read",
      "immutable": true
    }
  ],
  "problems": [
    {
      "code": "curriculum:validation_failed",
      "status": 400,
      "when": "Field/type/enum/reference validation fails.",
      "fields": [
        "type",
        "title",
        "status",
        "detail",
        "code",
        "requestId",
        "traceId",
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:payload_too_large",
      "status": 413,
      "when": "An authenticated JSON request exceeds the bounded request-body limit; reject before repository or idempotency work and never echo request bytes.",
      "fields": []
    },
    {
      "code": "curriculum:unsupported_query_parameter",
      "status": 400,
      "when": "A query parameter is not in the endpoint contract.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:authentication_required",
      "status": 401,
      "when": "Bearer JWT is absent, invalid, expired, or not trusted.",
      "fields": []
    },
    {
      "code": "curriculum:forbidden",
      "status": 403,
      "when": "JWT tenant/scope/role does not authorize the operation.",
      "fields": []
    },
    {
      "code": "curriculum:not_found",
      "status": 404,
      "when": "Tenant-scoped active identity is absent.",
      "fields": []
    },
    {
      "code": "curriculum:precondition_failed",
      "status": 412,
      "when": "If-Match validator is stale.",
      "fields": []
    },
    {
      "code": "curriculum:precondition_required",
      "status": 428,
      "when": "A mutable write omits If-Match.",
      "fields": []
    },
    {
      "code": "curriculum:idempotency_in_progress",
      "status": 409,
      "when": "A live same-hash Curriculum lease already owns this retryable write; return Retry-After between 1 and 30 seconds and never enter the mutation callback.",
      "fields": []
    },
    {
      "code": "curriculum:idempotency_conflict",
      "status": 409,
      "when": "An Idempotency-Key is replayed with a different canonical request hash.",
      "fields": []
    },
    {
      "code": "curriculum:idempotency_key_expired",
      "status": 409,
      "when": "The stored key is expired and cannot prove a safe single-owner retry; fail closed without mutation.",
      "fields": []
    },
    {
      "code": "curriculum:idempotency_commit_uncertain",
      "status": 500,
      "when": "A prior owner may have committed a side effect without a trustworthy terminal receipt, or the ledger is legacy/tokenless/corrupt; fail closed without reclaim or mutation.",
      "fields": []
    },
    {
      "code": "curriculum:kc_semantics_conflict",
      "status": 409,
      "when": "KC creation reuses a canonical kc_id with different governed semantics, or reuses provenance-only source_kc_id for a different or server-minted canonical kc_id even when semantics match.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:standards_scope_invalid",
      "status": 422,
      "when": "Declared/partial scope is empty, dishonest, or inconsistent with bound rows.",
      "fields": [
        "fieldErrors",
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:rights_unresolved",
      "status": 422,
      "when": "Effective rights/admission is yellow, red, unknown, expired, missing, or conflicting.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:standards_readback_mismatch",
      "status": 422,
      "when": "Any source row/readback checksum or typed comparison fails.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:invalid_kc_kind",
      "status": 422,
      "when": "kc_kind is not substantive, disciplinary, application, or integrative.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:kc_definition_quality",
      "status": 422,
      "when": "A KC version lacks the governed definition, examples, boundary, or provenance required for its lifecycle step.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:invalid_kc_relation",
      "status": 422,
      "when": "A relation type/endpoint is invalid, prerequisite is sent to the non-DAG relation store, or a lineage transition violates lineage_id rules.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:unknown_kc",
      "status": 422,
      "when": "A referenced KC is missing, retired, cross-tenant, or not an active registry identity.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:prerequisite_cycle",
      "status": 409,
      "when": "A prerequisite write would create a directed cycle.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:invalid_kc_lifecycle",
      "status": 409,
      "when": "A KC version is edited in place or firmed outside the two allowed paths.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:live_learning_evidence_required",
      "status": 422,
      "when": "A first_genuine_response firming write lacks validated first-response evidence with explicit live_learning=true.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:approval_snapshot_incomplete",
      "status": 409,
      "when": "An approval cannot pin every distinct active KC to one exact version.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:course_not_routable",
      "status": 409,
      "when": "The current course graph is draft, retired, unapproved, changed since approval, or has a missing/non-firm KC snapshot.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:invalid_component_kind",
      "status": 422,
      "when": "kind is outside component_kind or violates its per-kind schema.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:reference_unresolved",
      "status": 422,
      "when": "A KC, component, Content version, renderer, policy, standard binding, or parent reference is absent, retired, cross-tenant, cyclic, or incompatible.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:content_not_eligible",
      "status": 422,
      "when": "Content authoritatively reports the exact version missing, blocked, revoked, otherwise non-green, malformed, or unresolved.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:content_unavailable",
      "status": 503,
      "when": "The exact-version eligibility read fails by network error, bounded timeout, or upstream HTTP 5xx. Return bounded Retry-After; only a proven pre-mutation component create/update or TimeBack ingest may leave an evidence-free failed_transient receipt for identical-key recovery.",
      "fields": [
        "cause"
      ]
    },
    {
      "code": "curriculum:content_version_mismatch",
      "status": 422,
      "when": "content_version_id does not belong to content_id or content_kind does not match Content readback.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:invalid_content_bank_member_contract",
      "status": 409,
      "when": "Content returns content.invalid_test_bank_member_contract or content.bank_kc_attribution_incomplete for the exact test-bank graph; expose the safe upstream code as the public RFC 7807 cause field and never convert this into generic ineligibility, transport failure, empty membership, fallback, or skip behavior.",
      "fields": [
        "fieldErrors",
        "cause"
      ]
    },
    {
      "code": "curriculum:renderer_incompatible",
      "status": 422,
      "when": "renderer_ref is missing, inactive, unknown, or rejects content_kind.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:repoint_pin_stale",
      "status": 409,
      "when": "A repoint/attach expected_target_ref compare-and-set premise does not equal the component's exact current pin — including attach against an already-pinned component and repoint against a superseded or legacy versionless pin. Nothing is written.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:repoint_identity_mismatch",
      "status": 409,
      "when": "A repoint attempts to change content_id or content_kind. A revision published under a new Content identity is a NEW identity: attach it to an unpinned placement instead of silently replacing an existing pin.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:repoint_target_not_serveable",
      "status": 409,
      "when": "Content authoritatively refuses the requested exact version for a repoint/attach — missing, not serveable, not release-eligible, or outside practice_eligible usage scope. The safe upstream cause is exposed as the RFC 7807 cause field; transient Content unavailability stays 503 curriculum:content_unavailable.",
      "fields": [
        "cause"
      ]
    },
    {
      "code": "curriculum:approved_chain_repoint_frozen",
      "status": 409,
      "when": "Producer self-service repoint/attach targets a published component pinning an approved immutable assessment chain. The pin moves only through the reviewed-replacement manifest path: a committed reviewed manifest applied through the platform's dry-run-first ETag/CAS corridor.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:member_position_conflict",
      "status": 409,
      "when": "Two active siblings claim one position.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:relationship_cycle",
      "status": 409,
      "when": "A component reparent or governed prerequisite mutation would make a node its own ancestor.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:lesson_structure_missing",
      "status": 409,
      "when": "A course anchor exists but has no active ordered, KC-scoped routable member structure.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:publication_incomplete",
      "status": 409,
      "when": "A course/component publish is attempted before exact tree readback or before every descendant is published bottom-up; course roots must publish last.",
      "fields": [
        "fieldErrors",
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:expected_xp_ambiguous",
      "status": 409,
      "when": "A graph/cycle/target error prevents deterministic leaf/fallback selection.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:invalid_gate_contract",
      "status": 422,
      "when": "A gating member lacks valid Content target, passing criteria, remediation map, or test-bank/spec compatibility.",
      "fields": [
        "fieldErrors"
      ]
    },
    {
      "code": "curriculum:bank_exhausted",
      "status": 409,
      "when": "Every eligible form in the gate's Content test_bank has already been seen by the student.",
      "fields": []
    },
    {
      "code": "curriculum:adapter_rejected",
      "status": 422,
      "when": "A source-shaped TimeBack row cannot materialize without inventing order, KC scope, Content identity, or gate semantics.",
      "fields": [
        "rowErrors"
      ]
    },
    {
      "code": "curriculum:transport_invalid",
      "status": 422,
      "when": "A Common Cartridge/CFPackage preview or import fails structure, reference, or round-trip validation.",
      "fields": [
        "rowErrors"
      ]
    }
  ],
  "crossCutting": {
    "authentication": "Platform HS256 bearer JWT; tenantId plus curriculum:read/write/import/admin scopes. tenant_id is never caller-selected in path/body.",
    "idempotency": "Every POST/PATCH/DELETE/import uses Idempotency-Key stored in platform.idempotency_key with module=curriculum,surface=alpha. Claim, completion, and failure are conditional on the exact scope, canonical hash, curriculum-v2 protocol, and a server lease token; requestId is audit identity only. Exactly one token owner mutates. Terminal same-hash rows replay exact stored status/body/headers, live same-hash rows return 409 curriculum:idempotency_in_progress with bounded Retry-After, different hashes return 409 curriculum:idempotency_conflict, and reclaim requires an unexpired failed_transient row explicitly classified rollback-safe with no response, resource, header, or lock evidence. A typed curriculum:content_unavailable error qualifies only at the proven pre-mutation component create/update and TimeBack-ingest boundaries; any unmarked or post-mutation 5xx remains commit_uncertain. Expired, legacy/tokenless stale, corrupt, ordinary stale, and commit-uncertain rows fail closed.",
    "concurrency": "Mutable identities/edges use ETag and If-Match; missing is 428, stale is 412. Immutable releases, bindings, rights decisions, readback evidence, KC versions, review decisions, approvals, snapshots, and firming events have no PATCH route.",
    "tenancy": "Every PK/FK/unique query includes tenant_id from the verified JWT. Raw SQL examples use :tenant_id and must execute inside the same tenant-scoped transaction/RLS context.",
    "polling": "List endpoints use stable sort, cursor paging, and updated_since only where rows are mutable. Immutable evidence uses created-at cursors.",
    "privacy": "No learner PII, Content bodies/answers, producer credentials, source secrets, or unrestricted copyrighted source dumps in Problems/logs/evidence."
  },
  "forbiddenGuidance": [
    "KCs are CASE CFItems",
    "KC isChildOf is the canonical KC tree",
    "KC-to-standard maps are CASE isPartOf associations",
    "Course/component/member is one CASE CFItem row",
    "target_ref or gate behavior belongs on reusable component identity",
    "Container expected_xp is added to descendant expected_xp",
    "CASE transport grants content-use rights",
    "Acquired means admitted",
    "Yellow may proceed with warning",
    "Curriculum stores Content producer verdict, quality bar, release status, or evidence",
    "Publication or first assignment firms a KC",
    "Incept steward monitoring/queues/plans are Curriculum schema",
    "Target tables/routes are already deployed"
  ],
  "generatedFrom": {
    "canonicalSource": "loop/curriculum/artifacts/alpha/data_dictionary/source/curriculum-alpha-data-dictionary.source.mjs",
    "architecture": "loop/curriculum/artifacts/alpha/architecture/commitments.json",
    "customerEval": "loop/curriculum/evals/alpha/data_dictionary/customer_eval.json",
    "rubric": "loop/curriculum/evals/alpha/data_dictionary/rubric.json"
  },
  "sourceSha256": "be42157dbbd7a71ee0e2b300b16ba7d59fd3d2e4066fbc8ad474045902b93f44",
  "architectureSha256": "b69c9adec55092194dda1bd171eb7b57b1718688b36ea4074eb9c9b861e23bcb",
  "evalPairSha256": "4db7ec22e2e05d59bb5bad66fcaca73afbf19a4ea21907cfcf856587d1fe8989",
  "sourceSummary": {
    "tables": 25,
    "fields": 280,
    "enumSets": 23,
    "workflows": 16,
    "endpoints": 62,
    "problems": 45,
    "architectureDecisions": 35,
    "tracedArchitectureDecisions": 35
  }
}
