Platform3 · CASE · 1EdTech

CASE 1EdTech Data Dictionary

The tracked owning contract for CASE fields, public errors, lifecycle meaning, and #707 legacy-KC boundaries. Generated bytes bind the architecture, official CASE 1.1 snapshot, executable schema sources, and reconstruction record by SHA-256.

13 tables204 fields7 enum setssource 2388c34481a3

One reproducible authority chain

13tables preserved
204fields preserved
19routes documented
7reviewed reconstruction changes

The generated JSON and HTML are exact functions of tracked inputs. Missing inputs, stale hashes, generation drift, or missing anchors fail the release gate.

Post-#707 Knowledge Component boundary

Retained legacy CASE Knowledge Component CFItems remain readable, listable, and exportable as immutable historical evidence. CASE rejects their create, update, retire, delete, and governed relationship mutation with case:legacy_kc_read_only.

Owner: Curriculum is the sole owner of active Knowledge Component authoring, retirement validation, and governed KC graph semantics.

Exactly four governed legacy relationships: precedes, ext:alpha.needs_first, replacedBy, exactMatchOf

CITD-019: Under CITD-019, CASE extensions are opaque pass-through bytes. CASE does not interpret registry KC references such as scope_kc_refs or remediation kc_ref/kc_id; Curriculum validates those references in the registry-native model.

Other stock CASE association types retain normal CASE behavior; this cutover must not broaden the four governed legacy relationship types.

API contract

Base path: /ims/case/v1p1

MethodPathClassBehavior
GET/CFDocumentsCASE Provider pass-throughList CFDocuments.
POST/CFDocumentsTimeBack write extensionCreate a CFDocument.
GET/CFDocuments/{sourcedId}CASE Provider pass-throughRead one CFDocument.
PUT/PATCH/DELETE/CFDocuments/{sourcedId}TimeBack write extensionReplace, update, or retire a document with If-Match.
GET/POST/CFItemsTimeBack browse/write extensionList or create CFItems; POST requires identifier, uri, fullStatement, CFDocumentURI, and parentIdentifier.
GET/PUT/PATCH/DELETE/CFItems/{sourcedId}CASE Provider read plus TimeBack writesRead, update, or retire one CFItem.
GET/CFItemAssociations/{sourcedId}CASE Provider pass-throughRead a CFItem and all its associations.
GET/POST/CFAssociationsTimeBack browse/write extensionList or create graph edges.
GET/PUT/PATCH/DELETE/CFAssociations/{sourcedId}CASE Provider read plus TimeBack writesRead, update, or retire one association.
GET/CFPackages/{sourcedId}CASE Provider pass-throughExport a spec-pure package.
POST/CFPackagesTimeBack import extensionImport a package transactionally.
GET/CFConcepts/{sourcedId}CASE Provider pass-throughRead imported concept definitions.
GET/CFSubjects/{sourcedId}CASE Provider pass-throughRead imported subject definitions.
GET/CFLicenses/{sourcedId}CASE Provider pass-throughRead imported license definitions.
GET/CFItemTypes/{sourcedId}CASE Provider pass-throughRead imported item-type definitions.
GET/CFAssociationGroupings/{sourcedId}CASE Provider pass-throughRead imported association-grouping definitions.
GET/CFRubrics/{sourcedId}CASE Provider pass-throughRead imported rubric definitions.
GET/POST/AlignmentsTimeBack platform extensionList/create external-ID to CFItem links.
GET/PUT/PATCH/DELETE/Alignments/{alignmentId}TimeBack platform extensionRead, update, or delete one Alignment.

Tables and fields

CASE 1.1 CFDocument fields are pass-through in body JSONB; platform3 adds tenant, id, resource_type, import, ETag, timestamps, and retirement sidecars. · Mixed pass-through plus gap fill

case.cf_document

Stores one standards-framework container, such as Common Core State Standards Math 2010. It is the root object a browser lists before loading CFItems.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Created by POST /CFDocuments or CFPackage import, updated with If-Match, soft-retired on DELETE unless active CFItems/CFAssociations/Alpha references block retirement with case:resource_referenced, and exported inside CFPackage without platform sidecar fields.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
_platform.retired_at
retired_at
TIMESTAMPTZ
Yes
Soft-retirement timestamp for CASE resources that should disappear from default reads and spec-pure package export while remaining auditable.
Constraint: Null means active. Non-null rows are excluded from default list/detail/export responses. Setting non-null is blocked while active CFItems or CFAssociations point at the document, including the declared standards_framework_refs document link.
Invalid when: Set while active same-tenant rows still reference the document; the API must return case:resource_referenced and the trigger raises pg 23503 with the blocker path.
TimeBack gap fill: CASE does not define platform retention; platform3 pins soft-retire semantics for CFDocument, CFItem, and CFAssociation.
null
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-document-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for the CFDocument.
Constraint: Must match the CASE UUID pattern and be unique per tenant.
Invalid when: Not a UUID, duplicate in same tenant, or changed after dependent CFItems exist.
1EdTech pass-through: CFDocumentDType.required.identifier.
3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48
uriTEXT URI
No
Network-resolvable URI that identifies the CFDocument for CASE exchange.
Constraint: Absolute URI. Must be unique per tenant and should remain stable across export/import.
Invalid when: Relative URL, malformed URI, or points at a different identifier.
1EdTech pass-through: CFDocumentDType.required.uri.
https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48
frameworkType
framework_type
TEXT
Yes
Publisher's type label for this framework, such as the CASE predefined value CourseCodes.
Constraint: Normalized string. Only CourseCodes has predefined CASE 1.1 semantics; other values are publisher-defined and preserved.
Invalid when: Invented by platform3 as a default, contains control characters, or used as a closed enum beyond CourseCodes.
1EdTech pass-through: CFDocumentDType.frameworkType.
CourseCodes
caseVersion
case_version
TEXT
Yes
CASE model version for this document.
Constraint: If present, the only valid value on this surface is 1.1.
Invalid when: Any value other than 1.1.
1EdTech pass-through: CFDocumentDType.caseVersion enum.
1.1
creatorTEXT
No
Authority that promulgated or created the framework.
Constraint: Required normalized string. Preserve publisher spelling because it is citation data.
Invalid when: Blank, replaced by importing tenant name, or rewritten to platform3.
1EdTech pass-through: CFDocumentDType.required.creator.
National Governors Association Center for Best Practices
titleTEXT
No
Human-readable title of the framework shown in document lists.
Constraint: Required normalized string, not unique by itself.
Invalid when: Blank or used as the primary key instead of identifier/uri.
1EdTech pass-through: CFDocumentDType.required.title.
Common Core State Standards for Mathematics
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system timestamp for the most recent change to the CASE document record.
Constraint: Required ISO 8601 date-time from the CASE payload; distinct from platform updated_at.
Invalid when: Missing, local-time string without offset, or overwritten with platform updated_at.
1EdTech pass-through: CFDocumentDType.required.lastChangeDateTime.
2026-01-15T09:30:00Z
officialSourceURL
official_source_url
TEXT URI
Yes
URL to the formal standards citation intended for humans.
Constraint: Absolute URI when present.
Invalid when: Relative URL or a platform mirror substituted for the official source.
1EdTech pass-through: CFDocumentDType.officialSourceURL.
https://www.corestandards.org/Math/
publisherTEXT
Yes
Entity responsible for making the framework available.
Constraint: Normalized string; may differ from creator.
Invalid when: Copied from creator without evidence when source payload provides a different publisher.
1EdTech pass-through: CFDocumentDType.publisher.
Common Core State Standards Initiative
descriptionTEXT
Yes
Human-readable framework description, stored as source text.
Constraint: String may contain Markdown/LaTeX; do not render or store trusted HTML in API responses.
Invalid when: Pre-rendered trusted HTML, stripped Markdown, or sanitized text that cannot round-trip.
1EdTech pass-through: CFDocumentDType.description changed to String in CASE 1.1.
Grade-band mathematics standards covering counting, operations, geometry, and statistics.
subjectTEXT[]
Yes
Topic or academic subject labels for the document.
Constraint: Array of normalized strings. Preserve publisher vocabulary; empty array means no subject provided.
Invalid when: Single comma-delimited string when API JSON uses an array, or unapproved translation of publisher labels.
1EdTech pass-through: CFDocumentDType.subject.
["Mathematics"]
subjectURI
subject_uri
JSONB LinkURIDType[]
Yes
CASE link collection pointing to authoritative CFSubject resources referenced by this row.
Constraint: When present, store a JSON array of LinkURI objects; each object must include title, identifier, and uri, with identifier as a CASE UUID and uri as a valid absolute URI.
Relation: Nullable zero-or-more link collection to CFSubject; each member resolves locally only when the target is persisted by this dictionary.
Invalid when: Scalar JSON, object instead of array, missing title/identifier/uri on any member, invalid URI, or an identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
[{"title":"Example CFSubject","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFSubject/11111111-1111-4111-8111-111111111111"}]
languageTEXT
Yes
Default language of text in the framework.
Constraint: Use ISO 639-2 language code when supplied by the publisher.
Invalid when: Browser locale such as en-US when publisher supplied ISO 639-2, or guessed values.
1EdTech pass-through: CFDocumentDType.language.
eng
versionTEXT
Yes
Publisher revision label for the framework.
Constraint: Normalized string; this is publisher versioning, not API or CASE version.
Invalid when: Confused with caseVersion or platform deployment version.
1EdTech pass-through: CFDocumentDType.version.
2010
adoptionStatus
adoption_status
TEXT
Yes
Publication/adoption status label from the standards publisher.
Constraint: Normalized string preserved from source.
Invalid when: Invented lifecycle values that contradict publisher status; platform retirement uses retired_at instead.
1EdTech pass-through: CFDocumentDType.adoptionStatus.
adopted
statusStartDate
status_start_date
DATE
Yes
Date the publisher status started.
Constraint: ISO 8601 date without time.
Invalid when: Timestamp, text date, or later than status_end_date.
1EdTech pass-through: CFDocumentDType.statusStartDate.
2010-06-02
statusEndDate
status_end_date
DATE
Yes
Date the publisher status ended or changed.
Constraint: ISO 8601 date without time; null means no publisher end date supplied.
Invalid when: Earlier than status_start_date or used as platform delete timestamp.
1EdTech pass-through: CFDocumentDType.statusEndDate.
null
licenseURI
license_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFLicense referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFLicense; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFLicense","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFLicense/11111111-1111-4111-8111-111111111111"}
notesTEXT
Yes
Publisher notes about the framework.
Constraint: String source text. Preserve Markdown/LaTeX and sanitize only at render boundaries.
Invalid when: Trusted HTML or internal platform notes mixed into publisher notes.
1EdTech pass-through: CFDocumentDType.notes.
Imported from the public standards package released by the publisher.
extensionsJSONB
Yes
Proprietary CASE extension object for CFDocument data that is not in the core model. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: Must be a JSON object when present. Preserve unknown keys exactly; do not put platform audit metadata here.
Invalid when: Array/scalar JSON, platform tenant metadata, or Alignment external IDs.
1EdTech pass-through: CFDocumentExtensionDType additionalProperties=true.
{"publisherExtension":{"reviewCycle":"annual"}}
CFPackageURI
cf_package_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFPackage referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFPackage; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFPackage","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFPackage/11111111-1111-4111-8111-111111111111"}

CASE 1.1 item fields are pass-through in body JSONB. cfDocumentIdentifier and parentIdentifier are validated body fields, not flat physical columns. · Mixed pass-through plus gap fill

case.cf_item

Stores each standard, competency, skill, or grouping node inside a CFDocument tree.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Created by POST /CFItems or package import, placed in the tree through one active isChildOf CFAssociation, edited with If-Match, and soft-retired on DELETE unless active child CFItems/CFAssociations/Alignments/Alpha references block retirement with case:resource_referenced.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
_platform.retired_at
retired_at
TIMESTAMPTZ
Yes
Soft-retirement timestamp for CASE resources that should disappear from default reads and spec-pure package export while remaining auditable.
Constraint: Null means active. Non-null rows are excluded from default list/detail/export responses. Setting non-null is blocked by active child CFItems, CFAssociations, Alignments, or CASE-local component references; opaque registry KC extension refs do not block CASE retirement.
Invalid when: Set while active same-tenant rows still reference the item; the API must return case:resource_referenced and the trigger raises pg 23503 with the blocker path.
TimeBack gap fill: CASE does not define platform retention; platform3 pins soft-retire semantics for CFDocument, CFItem, and CFAssociation.
null
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-item-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this item.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Duplicate in tenant, missing, not UUID, or changed after associations point to it.
1EdTech pass-through: CFItemDType.required.identifier.
59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f
fullStatement
full_statement
TEXT
No
Complete statement text for the standard, competency, or grouping node.
Constraint: Required string. Preserve source markup/LaTeX; sanitize only when rendered by a browser app.
Invalid when: Blank, stripped of markup needed for meaning, or stored as trusted HTML.
1EdTech pass-through: CFItemDType.required.fullStatement; String in CASE 1.1.
Interpret products of whole numbers, e.g., interpret 5 x 7 as the total number of objects in 5 groups of 7 objects each.
alternativeLabel
alternative_label
TEXT
Yes
Publisher's alternate term for competency, such as outcome or objective.
Constraint: Normalized string when present.
Invalid when: Used to rename platform fields or override CFItemType.
1EdTech pass-through: CFItemDType.alternativeLabel.
Learning Objective
CFItemType
cf_item_type
TEXT
Yes
Text label for the class of statement as named by the publisher.
Constraint: Normalized string. Prefer CFItemTypeURI when the package defines typed item-type records.
Invalid when: Invented by platform3 when the publisher did not supply a type.
1EdTech pass-through: CFItemDType.CFItemType.
Content Standard
uriTEXT URI
No
Network-resolvable URI identifying this CFItem in CASE exchange.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL, malformed URI, or points to a different identifier.
1EdTech pass-through: CFItemDType.required.uri.
https://standards.example.org/case/cfitems/59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f
humanCodingScheme
human_coding_scheme
TEXT
Yes
Human-referenceable publisher code shown in standards browsers.
Constraint: Normalized string; not globally unique unless the publisher makes it so. Query with CFDocument scope.
Invalid when: Used as the primary key, stripped of punctuation, or assumed unique across frameworks.
1EdTech pass-through: CFItemDType.humanCodingScheme.
CCSS.MATH.CONTENT.3.OA.A.1
listEnumeration
list_enumeration
TEXT
Yes
Publisher list-position text for display ordering.
Constraint: Normalized string. sequence_number on isChildOf associations is preferred for tree ordering when both exist.
Invalid when: Used as the only ordering mechanism when a structural CFAssociation sequenceNumber is present.
1EdTech pass-through: CFItemDType.listEnumeration.
A.1
abbreviatedStatement
abbreviated_statement
TEXT
Yes
Short display form of fullStatement.
Constraint: Normalized string; may be null even when fullStatement is long.
Invalid when: Used as a replacement for fullStatement in detail/export responses.
1EdTech pass-through: CFItemDType.abbreviatedStatement.
Interpret products of whole numbers.
conceptKeywords
concept_keywords
TEXT[]
Yes
Free-text keywords and phrases describing the item's concepts.
Constraint: Array of strings. Preserve publisher terms and order.
Invalid when: Stored as one pipe-delimited string in API JSON or lowercased when publisher case matters.
1EdTech pass-through: CFItemDType.conceptKeywords.
["multiplication","equal groups"]
conceptKeywordsURI
concept_keywords_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFConcept referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFConcept; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFConcept","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFConcept/11111111-1111-4111-8111-111111111111"}
notesTEXT
Yes
Information about derivation or editorial context for the item.
Constraint: Source text. Preserve markup; sanitize only at render boundaries.
Invalid when: Internal import notes mixed with publisher notes.
1EdTech pass-through: CFItemDType.notes.
Clarification examples are copied from the publisher release notes.
subjectTEXT[]
Yes
Subject labels for this item.
Constraint: Array of normalized strings. May be narrower than the document subject.
Invalid when: Comma-delimited string in API JSON or guessed subject not present in source.
1EdTech pass-through: CFItemDType.subject.
["Mathematics","Operations and Algebraic Thinking"]
subjectURI
subject_uri
JSONB LinkURIDType[]
Yes
CASE link collection pointing to authoritative CFSubject resources referenced by this row.
Constraint: When present, store a JSON array of LinkURI objects; each object must include title, identifier, and uri, with identifier as a CASE UUID and uri as a valid absolute URI.
Relation: Nullable zero-or-more link collection to CFSubject; each member resolves locally only when the target is persisted by this dictionary.
Invalid when: Scalar JSON, object instead of array, missing title/identifier/uri on any member, invalid URI, or an identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
[{"title":"Example CFSubject","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFSubject/11111111-1111-4111-8111-111111111111"}]
languageTEXT
Yes
Default language of the item text.
Constraint: Use ISO 639-2 language code when supplied.
Invalid when: Browser locale or guessed language when source is silent.
1EdTech pass-through: CFItemDType.language.
eng
educationLevel
education_level
TEXT[]
Yes
Grade, level, or instructional level at which the item is intended.
Constraint: Array of normalized strings from the publisher vocabulary; use filters exactly as stored.
Invalid when: Stored as integer, comma string, or translated to local grade names during import.
1EdTech pass-through: CFItemDType.educationLevel.
["03"]
CFItemTypeURI
cf_item_type_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFItemType referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFItemType; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFItemType","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFItemType/11111111-1111-4111-8111-111111111111"}
licenseURI
license_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFLicense referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFLicense; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFLicense","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFLicense/11111111-1111-4111-8111-111111111111"}
statusStartDate
status_start_date
DATE
Yes
Date the publisher status for this item started.
Constraint: ISO 8601 date without time.
Invalid when: Timestamp or later than status_end_date.
1EdTech pass-through: CFItemDType.statusStartDate.
2010-06-02
statusEndDate
status_end_date
DATE
Yes
Date the publisher status for this item ended or changed.
Constraint: ISO 8601 date without time; null means no end date supplied.
Invalid when: Used as platform retirement timestamp instead of retired_at.
1EdTech pass-through: CFItemDType.statusEndDate.
null
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system timestamp for the most recent change to the CASE item record.
Constraint: Required ISO 8601 date-time; distinct from platform updated_at.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFItemDType.required.lastChangeDateTime.
2026-01-15T09:31:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for item data outside the core model. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present. Preserve unknown keys exactly; do not store tenant-private Alignment data here.
Invalid when: Array/scalar, platform metadata, or externalSystem/externalId links.
1EdTech pass-through: CFItemExtensionDType additionalProperties=true.
{"publisherExtension":{"depth":3}}
CFDocumentURI
cf_document_uri
JSONB LinkURIDType
No
CASE link object pointing to the authoritative CFDocument referenced by this row.
Constraint: Required on POST/PUT. The object must include title, identifier, and uri; identifier must resolve to an active same-tenant CFDocument.
Relation: Required belongs-to-one link to an active same-tenant case.cf_document row by (tenant_id, id).
Invalid when: Missing from a CFItem write body, lacks title/identifier/uri, has invalid URI, mismatches body->>'cfDocumentIdentifier', or does not resolve to the same tenant.
Mixed pass-through plus gap fill: CASE LinkURIDType pass-through plus TimeBack write requiredness from the implementation contract.
{"title":"Example CFDocument","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFDocument/11111111-1111-4111-8111-111111111111"}
cfDocumentIdentifier
cf_document_identifier
TEXT
No
Body-level document join key derived from CFDocumentURI.identifier for efficient tenant-scoped raw queries.
Constraint: Must equal CFDocumentURI.identifier and reference an active or retained cf_document row in the same tenant.
Relation: Belongs to one case.cf_document by (tenant_id, id).
Invalid when: Differs from CFDocumentURI.identifier or points across tenant.
TimeBack gap fill: Derived body field persisted in body->>'cfDocumentIdentifier'.
3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48
parentIdentifier
parent_identifier
TEXT
No
Required body-level structural parent for tree navigation; points to either the owning CFDocument root or another CFItem.
Constraint: Required on POST/PUT. Null is never valid for an active CFItem; the value is checked against the same-document parent invariant.
Relation: References case.cf_document.id or case.cf_item.id in same tenant.
Invalid when: Missing parentIdentifier, multiple active parents, cycle, or parent from another CFDocument.
TimeBack gap fill: TimeBack invariant over CASE associations and implementation write contract.
3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48

CASE 1.1 association fields are pass-through in body JSONB, with TimeBack validation that makes tree and extension behavior deterministic. · Mixed pass-through plus gap fill

case.cf_association

Stores typed graph edges between CFItems or CFDocuments, including the isChildOf edges that create the navigable tree.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Created by POST /CFAssociations, CFItem create placement, or package import; edited with If-Match; soft-retired on DELETE.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
_platform.retired_at
retired_at
TIMESTAMPTZ
Yes
Soft-retirement timestamp for CASE resources that should disappear from default reads and spec-pure package export while remaining auditable.
Constraint: Null means active. Non-null rows are excluded from default list/detail/export responses unless an administrative audit route asks for retired rows.
Invalid when: Set on an Alignment hard-delete row without an audit retention rule, or set while the resource is still returned in normal CFPackage export.
TimeBack gap fill: CASE does not define platform retention; platform3 pins soft-retire semantics for CFDocument, CFItem, and CFAssociation.
null
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-association-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this association.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Duplicate, missing, not UUID, or changed after dependent tree projections use it.
1EdTech pass-through: CFAssociationDType.required.identifier.
0a77d011-0f33-4e2e-8aac-5b59860e1fc1
associationType
association_type
TEXT
No
Type of graph relationship between origin and destination.
Constraint: Required. Known CASE values or ext:* extension value only.
Invalid when: Unknown value without ext:, typo such as isChildrenOf, or external-ID relationship better modeled as Alignment.
1EdTech pass-through: CFAssociationDType.associationType anyOf enum/pattern.
isChildOf
sequenceNumber
sequence_number
INTEGER
Yes
Ordering hint for associated objects from the perspective of this relationship.
Constraint: 32-bit integer. For tree children, ascending sequence_number is the default sibling order when present.
Invalid when: Negative when publisher disallows it, non-integer, or used to replace isChildOf parentage.
1EdTech pass-through: CFAssociationDType.sequenceNumber.
10
uriTEXT URI
No
Network-resolvable URI for this association.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL, malformed URI, or points at a different association identifier.
1EdTech pass-through: CFAssociationDType.required.uri.
https://standards.example.org/case/cfassociations/0a77d011-0f33-4e2e-8aac-5b59860e1fc1
originNodeURI
origin_node_uri
JSONB LinkGenURIDType
No
Origin side of the association, usually the child item for isChildOf.
Constraint: Required object with title, identifier, uri, and optional targetType. Missing targetType defaults to CASE.
Relation: Belongs to one origin CFDocument or CFItem when targetType is CASE.
Invalid when: Missing title/identifier/uri, invalid targetType, or external system IDs stored here.
1EdTech pass-through: CFAssociationDType.required.originNodeURI.
{"title":"CCSS.MATH.CONTENT.3.OA.A.1","identifier":"59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f","uri":"https://standards.example.org/case/cfitems/59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f","targetType":"CASE"}
originNodeURI.identifier
origin_identifier
TEXT
No
Extracted origin identifier for indexed graph queries.
Constraint: Must equal originNodeURI.identifier. For targetType CASE and known local objects, references CFDocument or CFItem in the same tenant.
Relation: References case.cf_item.identifier or case.cf_document.identifier when origin_target_type=CASE.
Invalid when: Differs from originNodeURI.identifier or references another tenant.
TimeBack gap fill: Relational projection of CASE LinkGenURIDType.
59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f
originNodeURI.targetType
origin_target_type
TEXT
No
Target type of the origin link.
Constraint: Defaults to CASE when absent. Otherwise must match ext:*.
Invalid when: Blank, invalid ext pattern, or ext:* used for isChildOf structural tree edges.
Mixed pass-through plus gap fill: LinkGenURIDType targetType.
CASE
destinationNodeURI
destination_node_uri
JSONB LinkGenURIDType
No
Destination side of the association, usually the parent item/document for isChildOf.
Constraint: Required object with title, identifier, uri, and optional targetType. Missing targetType defaults to CASE.
Relation: Belongs to one destination CFDocument or CFItem when targetType is CASE.
Invalid when: Missing title/identifier/uri or creates a cycle in the isChildOf tree.
1EdTech pass-through: CFAssociationDType.required.destinationNodeURI.
{"title":"Operations and Algebraic Thinking","identifier":"3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48","uri":"https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48","targetType":"CASE"}
destinationNodeURI.identifier
destination_identifier
TEXT
No
Extracted destination identifier for indexed graph queries.
Constraint: Must equal destinationNodeURI.identifier and reference same-tenant CASE rows when targetType is CASE.
Relation: References case.cf_item.identifier or case.cf_document.identifier when destination_target_type=CASE.
Invalid when: Cross-tenant reference or differs from destinationNodeURI.identifier.
TimeBack gap fill: Relational projection of CASE LinkGenURIDType.
3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48
destinationNodeURI.targetType
destination_target_type
TEXT
No
Target type of the destination link.
Constraint: Defaults to CASE when absent. Otherwise must match ext:*.
Invalid when: Invalid ext pattern or used to represent a tenant-specific lesson/resource ID.
Mixed pass-through plus gap fill: LinkGenURIDType targetType.
CASE
CFAssociationGroupingURI
cf_association_grouping_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFAssociationGrouping referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFAssociationGrouping; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFAssociationGrouping","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFAssociationGrouping/11111111-1111-4111-8111-111111111111"}
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system timestamp for the most recent change to this association.
Constraint: Required ISO 8601 date-time; distinct from platform updated_at.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFAssociationDType.required.lastChangeDateTime.
2026-01-15T09:32:00Z
notesTEXT
Yes
Human-readable publisher notes describing the association.
Constraint: String source text. Preserve markup and sanitize at render boundaries.
Invalid when: Used for internal import errors or rendered trusted HTML.
1EdTech pass-through: CFAssociationDType.notes added in CASE 1.1.
Primary grade 3 operations-and-algebraic-thinking placement.
extensionsJSONB
Yes
Proprietary CASE extension object for association data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present. Preserve unknown keys exactly.
Invalid when: Platform audit metadata or Alignment external IDs.
1EdTech pass-through: CFAssociationExtensionDType additionalProperties=true.
{"publisherExtension":{"alignmentStrength":"high"}}
CFDocumentURI
cf_document_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFDocument referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFDocument; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFDocument","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFDocument/11111111-1111-4111-8111-111111111111"}

CASE defines the CFPackage envelope. This table is TimeBack audit/idempotency evidence and is never exported inside a CASE package. · TimeBack gap fill

case.cf_package_import

Records each transactional CFPackage import, its canonical package hash, row counts, and validation result.

Physical storage: Flat platform audit/control row. Columns shown here are physical columns.
Lifecycle: Created at import start, committed as succeeded only when all document, item, association, definition, and rubric rows commit atomically, or failed with rowErrors and no partial writes.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
CFPackage.CFDocument.identifier
document_identifier
UUID
No
CFDocument identifier targeted by the package.
Constraint: Must match the package CFDocument.identifier and any rows committed under this import.
Relation: References case.cf_document.identifier after successful import.
Invalid when: Differs from the package document identifier or references a document not touched by the import.
TimeBack gap fill: Import audit projection.
3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48
Idempotency package hash
package_hash
TEXT
No
Canonical SHA-256 digest of the submitted CFPackage JSON.
Constraint: Format sha256:<64 lowercase hex>. Same tenant + same route + same hash can be recognized as duplicate package content.
Invalid when: Uppercase, missing sha256: prefix, not computed from canonical payload, or reused with different body.
TimeBack gap fill: CITD-008 package hash.
sha256:2e1a0f8e7a4d5e1a7b0c9c4a8b3c2d1f0e9a7b6c5d4e3f2a1b0c9d8e7f6a5b4c
sourceUri
source_uri
TEXT URI
Yes
Optional source location from which the package was obtained.
Constraint: Absolute URI when supplied. Used for evidence only, not as identity.
Invalid when: Relative URL or used as the package primary key.
TimeBack gap fill: Conformance and import evidence field.
https://publisher.example.org/case/packages/common-core-math-2010.json
statusTEXT
No
Outcome of the import transaction.
Constraint: One of pending, succeeded, failed.
Invalid when: Unknown status, succeeded while errors are present, or failed with committed rows.
TimeBack gap fill: TimeBack import control enum.
succeeded
rowCounts
row_counts
JSONB
No
Counts of rows validated and committed by table.
Constraint: JSON object with integer counts per CASE table. Missing tables default to 0.
Invalid when: Negative counts, strings, or counts that do not match committed rows.
TimeBack gap fill: Import evidence projection.
{"cf_documents":1,"cf_items":344,"cf_associations":343,"cf_rubrics":0}
Problem.rowErrors
row_errors
JSONB
Yes
Validation failures tied to package rows or graph invariants.
Constraint: Null for succeeded imports. Failed imports store row number/path, code, message, and field when available.
Invalid when: Present on succeeded imports, lacks stable code, or contains raw sensitive payload fragments.
TimeBack gap fill: Typed Problem rowErrors for package import.
[{"path":"CFAssociations[12].associationType","code":"case:validation_failed","message":"Unknown associationType"}]
committedAt
committed_at
TIMESTAMPTZ
Yes
Server time when normalized CASE rows committed.
Constraint: Required when status=succeeded; null for pending or failed.
Invalid when: Set for failed imports or before row counts match committed rows.
TimeBack gap fill: Import lifecycle evidence.
2026-05-27T12:06:00Z

Alignment is platform3-specific and intentionally separate from CFAssociation. · TimeBack gap fill

case.alignment

Links an integrator's external system identifier, such as a curriculum lesson ID, to a CASE CFItem without contaminating the canonical CASE graph.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Created by POST /Alignments or direct app writes, edited with If-Match, deleted as a hard delete in the public API, and never exported in CFPackage. The physical table has retired_at for retained tombstones and active uniqueness.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
_platform.retired_at
retired_at
TIMESTAMPTZ
Yes
Physical liveness/tombstone column for Alignment active uniqueness; public DELETE normally hard-deletes the row.
Constraint: Null means active. Active external-ID uniqueness is scoped by where retired_at is null; there is no deleted_at column.
Invalid when: A raw lookup filters deleted_at instead of retired_at, includes a non-null retained tombstone as active, or expects Alignment rows in CFPackage export.
TimeBack gap fill: CASE does not define platform retention; platform3 pins soft-retire semantics for CFDocument, CFItem, and CFAssociation.
null
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-alignment-7a4f-v3"
alignmentId
alignment_id
TEXT
No
Stable TimeBack identifier for this external-ID link; stored as the physical id and in body.alignmentId.
Constraint: Generated by platform3 or accepted as an idempotent client ID. Unique per tenant.
Invalid when: Blank, reused for a different external ID, or shaped like a CASE identifier to imply 1EdTech authority.
TimeBack gap fill: CITD-018 Alignment resource.
aln_01jz8t6m4v8q3f0x5e2n9p7r6s
externalSystem
external_system
TEXT
No
Integrator-owned system namespace for the external identifier.
Constraint: Required normalized string, max practical length 200, unique with external_id per tenant.
Invalid when: Contains credentials, tenant secrets, or ambiguous labels such as default.
TimeBack gap fill: CITD-018 Alignment fields.
acme-curriculum
externalId
external_id
TEXT
No
Identifier from the external system being aligned to a CFItem.
Constraint: Required string, max practical length 500, unique with external_system per tenant. Preserve case and punctuation.
Invalid when: Normalized in a way that breaks lookup, stored inside CFItem.extensions, or used as a CFAssociation target.
TimeBack gap fill: CITD-018 Alignment fields.
lesson-3oa-a1-intro
cfItemUri
cf_item_uri
TEXT URI
Conditional
CASE URI for the CFItem target.
Constraint: Individually nullable. Required only when cfItemIdentifier is blank; when supplied, it must be an absolute URI matching the referenced CFItem uri.
Relation: Conditionally belongs to one case.cf_item by URI; at least one of cf_item_uri/cf_item_identifier must resolve.
Invalid when: Both cf_item_uri and cf_item_identifier are blank, points to a CFDocument/non-CASE resource, or resolves to a different CFItem than cf_item_identifier.
TimeBack gap fill: CITD-018 Alignment fields.
https://standards.example.org/case/cfitems/59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f
cfItemIdentifier
cf_item_identifier
UUID
Conditional
Local CASE identifier for the CFItem target, indexed for joins.
Constraint: Individually nullable. Required only when cfItemUri is blank; when supplied, it must reference an active same-tenant CFItem at create/update time.
Relation: Conditionally belongs to one case.cf_item; at least one of cf_item_identifier/cf_item_uri must resolve.
Invalid when: Both cf_item_identifier and cf_item_uri are blank, points at retired CFItem during create, or resolves to a different CFItem than cf_item_uri.
TimeBack gap fill: CITD-018 Alignment fields.
59e8f77c-f1aa-4326-87d8-4b86fa6f7e6f
labelTEXT
Yes
Human-readable description of why the external ID maps to the CFItem.
Constraint: Optional display text. It is tenant-confidential and not exported in CFPackage.
Invalid when: Used as alignment authority when both CFItem target fields are missing.
TimeBack gap fill: CITD-018 Alignment fields.
Lesson introduction aligns to 3.OA.A.1
metadataJSONB
Yes
Integrator-owned metadata about the alignment.
Constraint: JSON object only. Keep tenant-private details here, not in CASE extensions.
Invalid when: Scalar/array JSON, credentials, learner data, or any value exported into CFPackage.
TimeBack gap fill: CITD-018 Alignment metadata.
{"confidence":"manual-review","reviewedBy":"curriculum-team"}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_concept

Stores concept definitions imported through CFDefinitions and linked from CFItem concept keyword URI fields.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFConcepts/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-concept-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFConcept.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFConceptDType.identifier.
0bb9e0f4-5108-4cab-8f8e-b9c1a57f7531
uriTEXT URI
No
Network-resolvable URI for this CFConcept.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFConceptDType.uri.
https://standards.example.org/case/concepts/multiplication
titleTEXT
No
Human-readable concept title.
Constraint: Required normalized string.
Invalid when: Blank or replaced with an internal taxonomy label.
1EdTech pass-through: CFConceptDType.required.title.
Multiplication
keywordsTEXT
Yes
Pipe-delimited concept keywords from the publisher.
Constraint: Preserve delimiter and order when supplied.
Invalid when: Split/lowercased when exact publisher text is required for round trip.
1EdTech pass-through: CFConceptDType.keywords.
multiply|equal groups
hierarchyCode
hierarchy_code
TEXT
No
Publisher code locating the concept in its concept hierarchy.
Constraint: Required normalized string.
Invalid when: Null, changed during import, or used as the row primary key.
1EdTech pass-through: CFConceptDType.required.hierarchyCode.
M.3.OA
descriptionTEXT
Yes
Human-readable concept description.
Constraint: String source text. Preserve markup.
Invalid when: Trusted HTML or internal import notes.
1EdTech pass-through: CFConceptDType.description.
Concepts related to multiplication and equal groups.
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFConceptDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for concept data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFConceptExtensionDType.
{"publisherExtension":{"domain":"math"}}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_subject

Stores subject definitions imported through CFDefinitions and linked from document/item subjectURI fields.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFSubjects/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-subject-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFSubject.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFSubjectDType.identifier.
8c8f5d1e-9d94-4fcb-bfa3-f2e0a2fa9a10
uriTEXT URI
No
Network-resolvable URI for this CFSubject.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFSubjectDType.uri.
https://standards.example.org/case/subjects/math
titleTEXT
No
Human-readable subject title.
Constraint: Required normalized string.
Invalid when: Blank or translated away from publisher text.
1EdTech pass-through: CFSubjectDType.required.title.
Mathematics
hierarchyCode
hierarchy_code
TEXT
No
Publisher code locating the subject in its hierarchy.
Constraint: Required normalized string.
Invalid when: Null or used as primary key.
1EdTech pass-through: CFSubjectDType.required.hierarchyCode.
MATH
descriptionTEXT
Yes
Human-readable subject description.
Constraint: String source text. Preserve markup.
Invalid when: Trusted HTML or internal notes.
1EdTech pass-through: CFSubjectDType.description.
Mathematics standards and competencies.
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFSubjectDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for subject data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFSubjectExtensionDType.
{"publisherExtension":{"cedsCode":"02"}}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_license

Stores license records imported through CFDefinitions and linked from CFDocument/CFItem licenseURI fields.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFLicenses/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-license-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFLicense.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFLicenseDType.identifier.
3f6ae243-4c10-4568-a817-0892d3e3e5e0
uriTEXT URI
No
Network-resolvable URI for this CFLicense.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFLicenseDType.uri.
https://standards.example.org/case/licenses/cc-by
titleTEXT
No
Human-readable license title.
Constraint: Required normalized string.
Invalid when: Blank or replaced with a platform shortcut.
1EdTech pass-through: CFLicenseDType.required.title.
CC BY 4.0
descriptionTEXT
Yes
Human-readable license description.
Constraint: String source text.
Invalid when: Internal legal notes mixed into publisher license description.
1EdTech pass-through: CFLicenseDType.description.
Allows sharing and adaptation with attribution.
licenseText
license_text
TEXT
No
Legal license text or link text conveyed by the organization.
Constraint: Required string. Preserve text exactly enough for round trip.
Invalid when: Blank, truncated, or moved only to notes.
1EdTech pass-through: CFLicenseDType.required.licenseText.
Creative Commons Attribution 4.0 International
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFLicenseDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for license data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFLicenseExtensionDType.
{"publisherExtension":{"spdx":"CC-BY-4.0"}}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_item_type

Stores publisher-defined item type definitions, such as cluster, domain, standard, competency, or benchmark.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFItemTypes/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-item-type-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFItemType.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFItemTypeDType.identifier.
7d7647f5-4d6f-4e67-a968-9915078aa1e1
uriTEXT URI
No
Network-resolvable URI for this CFItemType.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFItemTypeDType.uri.
https://standards.example.org/case/item-types/standard
titleTEXT
No
Human-readable item type title.
Constraint: Required normalized string.
Invalid when: Blank or mapped to local product label.
1EdTech pass-through: CFItemTypeDType.required.title.
Standard
descriptionTEXT
No
Description of what the item type means in this framework.
Constraint: Required string source text.
Invalid when: Blank or replaced with generic 'item type'.
1EdTech pass-through: CFItemTypeDType.required.description.
A leaf or near-leaf academic standard.
hierarchyCode
hierarchy_code
TEXT
No
Publisher code locating the type in the item-type hierarchy.
Constraint: Required normalized string.
Invalid when: Null or used as primary key.
1EdTech pass-through: CFItemTypeDType.required.hierarchyCode.
3
typeCode
type_code
TEXT
Yes
Text code used by the publisher for type identification.
Constraint: Normalized string when present.
Invalid when: Invented by platform3 or confused with hierarchy_code.
1EdTech pass-through: CFItemTypeDType.typeCode.
STD
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFItemTypeDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for item type data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFItemTypeExtensionDType.
{"publisherExtension":{"displayRank":3}}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_association_grouping

Stores publisher grouping definitions for sets of associations.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFAssociationGroupings/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-association-grouping-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFAssociationGrouping.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFAssociationGroupingDType.identifier.
19ce0a3d-3703-4877-8c51-fda04bb1c676
uriTEXT URI
No
Network-resolvable URI for this CFAssociationGrouping.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFAssociationGroupingDType.uri.
https://standards.example.org/case/association-groups/math-progressions
titleTEXT
No
Human-readable association grouping title.
Constraint: Required normalized string.
Invalid when: Blank or generated from internal grouping ID.
1EdTech pass-through: CFAssociationGroupingDType.required.title.
Math progressions
descriptionTEXT
Yes
Description of what this association group means.
Constraint: String source text.
Invalid when: Trusted HTML or internal import notes.
1EdTech pass-through: CFAssociationGroupingDType.description.
Progression relationships across grade-level math standards.
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFAssociationGroupingDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for association grouping data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFAssociationGroupingExtensionDType.
{"publisherExtension":{"groupType":"progression"}}

Imported from CFDefinitions or CFRubrics and served through official detail reads. First-class list/create/update/delete authoring is deferred. · 1EdTech pass-through

case.cf_rubric

Stores rubric definitions imported with CFPackage, including criteria and levels that complete the rubric.

Physical storage: CASE resource row: tenant_id/id/resource_type/import_batch_id/body/version/etag/timestamps/retired_at are physical columns; CASE payload fields are stored in body JSONB.
Lifecycle: Imported with CFPackage, read through GET /CFRubrics/{sourcedId}, and updated only by future package imports.
Primary key: (tenant_id, id)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-rubric-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for this CFRubric.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFRubricDType.identifier.
e9af0e37-fc6d-4680-9889-7d4b3460b8ee
uriTEXT URI
No
Network-resolvable URI for this CFRubric.
Constraint: Required absolute URI. Unique per tenant.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFRubricDType.uri.
https://standards.example.org/case/rubrics/math-practice
titleTEXT
Yes
Human-readable rubric title.
Constraint: Optional in CASE schema but should be preserved when supplied.
Invalid when: Invented title on import when source omitted it.
1EdTech pass-through: CFRubricDType.title.
Mathematical practice rubric
descriptionTEXT
Yes
Human-readable rubric description.
Constraint: String source text. Preserve markup.
Invalid when: Trusted HTML or internal notes.
1EdTech pass-through: CFRubricDType.description.
Rubric for explaining reasoning and modeling with mathematics.
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFRubricDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for rubric data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFRubricExtensionDType.
{"publisherExtension":{"audience":"teachers"}}

CASE 1.1 rubric criterion fields are pass-through; rubric_identifier is the relational parent key. · 1EdTech pass-through

case.cf_rubric_criterion

Stores one criterion row inside an imported CFRubric.

Physical storage: Rubric child parent keys are physical columns; CASE criterion/level payload fields remain in body JSONB.
Lifecycle: Imported with its parent CFRubric, read as part of CFRubric detail, and not directly authored in the first release.
Primary key: (tenant_id, identifier)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-rubric-criterion-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for the criterion.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFRubricCriterionDType.required.identifier.
d3b07384-d9a6-4d4f-9f29-2141f2513fd2
rubricId
rubric_identifier
UUID
No
Parent CFRubric identifier.
Constraint: Must reference case.cf_rubric in same tenant.
Relation: Belongs to one case.cf_rubric.
Invalid when: Missing or points to another tenant.
1EdTech pass-through: CFRubricCriterionDType.rubricId.
e9af0e37-fc6d-4680-9889-7d4b3460b8ee
uriTEXT URI
No
Network-resolvable URI for this criterion.
Constraint: Required absolute URI.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFRubricCriterionDType.required.uri.
https://standards.example.org/case/rubric-criteria/reasoning
categoryTEXT
Yes
Text label by which criteria may be grouped.
Constraint: Normalized string when present.
Invalid when: Used as the primary key or invented during import.
1EdTech pass-through: CFRubricCriterionDType.category.
Reasoning
descriptionTEXT
Yes
Criterion description shown to rubric users.
Constraint: String source text. Preserve markup.
Invalid when: Trusted HTML or internal scoring notes.
1EdTech pass-through: CFRubricCriterionDType.description.
Explains mathematical reasoning clearly.
CFItemURI
cf_item_uri
JSONB LinkURIDType
Yes
CASE link object pointing to the authoritative CFItem referenced by this row.
Constraint: When present, the object must include title, identifier, and uri; identifier is a CASE UUID and uri is a valid absolute URI.
Relation: Nullable belongs-to-one link to CFItem; not a separate table unless the target is persisted by this dictionary.
Invalid when: Missing title/identifier/uri, invalid URI, or identifier not scoped to the same tenant when the target is persisted locally.
1EdTech pass-through: CASE LinkURIDType.
{"title":"Example CFItem","identifier":"11111111-1111-4111-8111-111111111111","uri":"https://standards.example.org/CFItem/11111111-1111-4111-8111-111111111111"}
weightDOUBLE PRECISION
Yes
Numeric weight assigned to this criterion.
Constraint: Float. Null means publisher did not weight the criterion.
Invalid when: String percentage, negative value without publisher semantics, or normalized away from source.
1EdTech pass-through: CFRubricCriterionDType.weight.
0.25
positionINTEGER
Yes
Ordering position of this criterion within the rubric.
Constraint: 32-bit integer when present.
Invalid when: Non-integer or used as stable identity.
1EdTech pass-through: CFRubricCriterionDType.position.
1
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFRubricCriterionDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB
Yes
Proprietary CASE extension object for criterion data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: JSON object when present.
Invalid when: Platform metadata or non-object JSON.
1EdTech pass-through: CFRubricCriterionExtensionDType.
{"publisherExtension":{"scale":"4-point"}}

CASE 1.1 level fields are pass-through; rubric_criterion_identifier is the relational parent key. · 1EdTech pass-through

case.cf_rubric_criterion_level

Stores one achievement level inside an imported rubric criterion.

Physical storage: Rubric child parent keys are physical columns; CASE criterion/level payload fields remain in body JSONB.
Lifecycle: Imported with the parent criterion, read as part of CFRubric detail, and not directly authored in the first release.
Primary key: (tenant_id, identifier)

API field / columnType / nullMeaning and constraintsExample
_platform.tenant_id
tenant_id
TEXT
No
Tenant boundary for this row; every query must scope by this value and it must match the signed JWT tenantId.
Constraint: Required on every persisted CASE row. Stored as text to match the JWT tenantId claim; clients never send it inside CASE JSON.
Invalid when: Missing, blank, or different from the token tenantId. A cross-tenant join is invalid even when identifiers match.
Inherited platform contract: Inherits platform_audit_provenance and platform_single_deploy_tenant_scoped.
reviewer-case
_platform.import_batch_id
import_batch_id
TEXT
No
Audit handle for the write or CFPackage import that produced the row.
Constraint: Set by the API for per-resource writes and by CFPackage import for package rows. Same batch id may touch many CASE tables.
Invalid when: Null, blank, or reused for two package imports with different canonical package hashes.
Inherited platform contract: Architecture requires _platform.import_batch_id sidecar metadata on every persisted row.
imp_01jz8t6m4v8q3f0x5e2n9p7r6s
_platform.created_at
created_at
TIMESTAMPTZ
No
Server timestamp when platform3 first stored this row for the tenant.
Constraint: Generated by the service, UTC ISO 8601 when serialized, never accepted from client payloads.
Invalid when: Client-supplied timestamps, local-time strings without offset, or values earlier than the import batch start.
Inherited platform contract: Platform audit provenance.
2026-05-27T12:00:00Z
_platform.updated_at
updated_at
TIMESTAMPTZ
No
Server timestamp for the most recent accepted mutation of this row.
Constraint: Generated by the service. Used by updatedSince polling and ETag recalculation.
Invalid when: Older than created_at, supplied by the client, or not advanced after a mutable field changes.
Inherited platform contract: Pollable update filters and HTTP validators.
2026-05-27T12:05:00Z
ETag header
etag
TEXT
No
Strong HTTP validator for safe read-edit-write cycles.
Constraint: Generated from tenant, table, identifier, row version, and updated_at. PUT, PATCH, and DELETE require If-Match with this value.
Invalid when: Missing on mutable resource reads, reused after a mutation, weak validator, or accepted with a stale If-Match.
TimeBack gap fill: Per-resource ETag/If-Match is a TimeBack persistence gap fill over CASE reads.
"case-cf-rubric-criterion-level-7a4f-v3"
identifierUUID
No
Synthetic globally unique CASE identifier for the criterion level.
Constraint: Must match CASE UUID pattern and be unique per tenant.
Invalid when: Missing, not UUID, or duplicate in tenant.
1EdTech pass-through: CFRubricCriterionLevelDType.required.identifier.
a61af36a-4e73-4b51-809f-980111bb4d8d
rubricCriterionId
rubric_criterion_identifier
UUID
No
Parent CFRubricCriterion identifier.
Constraint: Must reference case.cf_rubric_criterion in same tenant.
Relation: Belongs to one case.cf_rubric_criterion.
Invalid when: Missing or points to another tenant.
1EdTech pass-through: CFRubricCriterionLevelDType.rubricCriterionId.
d3b07384-d9a6-4d4f-9f29-2141f2513fd2
uriTEXT URI
No
Network-resolvable URI for this level.
Constraint: Required absolute URI.
Invalid when: Relative URL or mismatched identifier.
1EdTech pass-through: CFRubricCriterionLevelDType.required.uri.
https://standards.example.org/case/rubric-levels/meets
descriptionTEXT
Yes
Level description.
Constraint: String source text. Preserve markup.
Invalid when: Trusted HTML or learner-specific feedback.
1EdTech pass-through: CFRubricCriterionLevelDType.description.
Reasoning is complete and uses appropriate examples.
qualityTEXT
Yes
Qualitative label for this level.
Constraint: Normalized string when present.
Invalid when: Invented by platform3 or confused with numeric score.
1EdTech pass-through: CFRubricCriterionLevelDType.quality.
Meets
scoreDOUBLE PRECISION
Yes
Points awarded for achieving this level.
Constraint: Float when present. Null is valid for qualitative-only rubrics.
Invalid when: String such as '3 pts' or normalized to percentage without source evidence.
1EdTech pass-through: CFRubricCriterionLevelDType.score.
3
feedbackTEXT
Yes
Pre-defined feedback text associated with the level.
Constraint: String source text. This is rubric template feedback, not learner-specific feedback.
Invalid when: Stores actual student feedback or includes learner PII.
1EdTech pass-through: CFRubricCriterionLevelDType.feedback.
Explain how each example supports your conclusion.
positionINTEGER
Yes
Ordering position of this level within the criterion.
Constraint: 32-bit integer when present.
Invalid when: Non-integer or used as stable identity.
1EdTech pass-through: CFRubricCriterionLevelDType.position.
3
lastChangeDateTime
last_change_date_time
TIMESTAMPTZ
No
Publisher/system change timestamp.
Constraint: Required ISO 8601 date-time.
Invalid when: Missing or overwritten with platform updated_at.
1EdTech pass-through: CFRubricCriterionLevelDType.required.lastChangeDateTime.
2026-01-15T09:00:00Z
extensionsJSONB[]
Yes
Proprietary CASE extension objects for criterion level data. Under CITD-019 these values are opaque pass-through bytes; CASE preserves them without assigning Curriculum registry semantics.
Constraint: Array of JSON objects when present.
Invalid when: Scalar JSON, platform metadata, or learner-specific values.
1EdTech pass-through: CFRubricCriterionLevelExtensionDType array.
[{"publisherExtension":{"levelColor":"green"}}]

Allowed values and typed Problems

case_association_type

CFAssociation associationType · field case.cf_association.association_type

ValueMeaningUse whenInvalid when
isChildOfStructural tree edge from a child CFItem to its parent CFItem or CFDocument root.Use exactly once per active CFItem within a tenant.Missing for a CFItem, duplicated for one CFItem, cyclic, or points outside the same CFDocument for the structural tree.
isPeerOfNon-hierarchical equivalence or peer relationship between items at comparable scope.Use when two standards should be browsed as peers without implying exact semantic identity.Used to create the primary tree or to replace exactMatchOf when the publisher asserts exact equivalence.
isPartOfPart-whole relationship that is not the primary isChildOf tree placement.Use for non-tree component membership or package-level grouping.Used when the browser needs a single structural parent; use isChildOf for that.
exactMatchOfCross-framework edge saying two items carry the same intended competency.Use for strict standards alignment across frameworks.Used for loose topical similarity; use isRelatedTo instead.
precedesOrdering edge saying the origin should be learned or displayed before the destination.Use for prerequisite or sequence relationships outside the primary tree.Used as a parent-child edge or with negative sequenceNumber values.
isRelatedToLoose relationship when no stronger CASE association type applies.Use for general topical or instructional links.Used when the relationship is actually structural, replacement, exact match, or translation.
replacedByLifecycle edge saying the origin item has been superseded by the destination item.Use when a publisher retires one standard in favor of another.Used while both records are current equivalents; exactMatchOf is the better value.
exemplarEdge from an item to an example or exemplar item/resource represented in CASE form.Use for CASE 1.1 exemplar relationships preserved from imported packages.Used for tenant-specific lesson IDs; use Alignment instead.
hasSkillLevelEdge that links a competency to a skill-level item.Use when a standards publisher expresses proficiency levels as CASE items.Used to model grade or educationLevel fields directly.
isTranslationOfCASE 1.1 edge saying the origin item is a translation of the destination item.Use for language translations of the same standard.Used for loosely adapted or simplified statements that are not translations.
ext:*CASE extension association type matching ext:[A-Za-z0-9._-]+.Use only for a publisher-defined association type that cannot be represented by known CASE values.Missing the ext: prefix, contains spaces, duplicates an existing known type, or stores an external-system ID link.

case_target_type

LinkGenURI targetType · field case.cf_association.origin_target_type / destination_target_type

ValueMeaningUse whenInvalid when
CASEThe linked identifier and URI refer to another CASE CFDocument or CFItem.Use for ordinary CASE graph edges and default missing values to CASE.Used for external-system lesson IDs or non-CASE resource IDs; those belong in Alignment.
ext:*An extension target type for a non-CASE framework reference.Use only when the source package legitimately links to a non-CASE target and names it with ext: prefix.No ext: prefix, spaces, or a value that should be represented as CASE.

case_version

CASE document version · field case.cf_document.case_version

ValueMeaningUse whenInvalid when
1.1The CFDocument follows the CASE 1.1 information model, including the 1.1 fields and data-type changes.Use for all new platform3 CASE 1EdTech documents that include a caseVersion.Any other version string, including 1.0 or v1p1, on this surface.

case_import_status

CFPackage import status · field case.cf_package_import.status

ValueMeaningUse whenInvalid when
pendingThe package has been accepted for validation but has not committed any CASE resource rows yet.Use only within a transaction or asynchronous future import path before final validation outcome.Left pending after a request has returned success or failure.
succeededThe package validated and all document, item, association, definition, and rubric rows committed atomically.Use after a successful POST /CFPackages import.Set when any rowErrors exist or row counts do not match committed rows.
failedThe package failed validation or conflicted with current state and no partial import committed.Use for typed case:package_import_failed or conflict outcomes.Any CASE resource row was partially committed for the same import_batch_id.

case_problem_code

Typed Problem code · field Problem.code

ValueMeaningUse whenInvalid when
case:validation_failedA request body, query parameter, or CASE field violates the dictionary constraints.Use when the route and parameter names are supported but a submitted value breaks a field type, CHECK, required-field, allowed-value, or JSON-shape rule. Use a sibling code for unsupported query names, missing parents, cycles, or stale ETags.Do not use for another failure category or without requestId and traceId.
case:not_foundThe tenant has no active resource for the supplied identifier.Use after authentication succeeds and the supplied identifier is well-formed, but no active same-tenant row exists. Do not use to hide missing scopes; that is case:forbidden.Do not use for another failure category or without requestId and traceId.
case:forbiddenThe JWT is valid but lacks the CASE scope or tenant access required for the route.Use when the token verifies but its tenantId or scopes do not authorize the attempted read, write, import, or admin action. Do not use for malformed values or absent rows.Do not use for another failure category or without requestId and traceId.
case:unsupported_query_parameterA list route received a query parameter outside the published query model.Use when the query string names a parameter this route does not publish at all. If the parameter is supported but the value is malformed, use case:validation_failed.Do not use for another failure category or without requestId and traceId.
case:association_cycleAn isChildOf edge would create a cycle in the active CFItem tree.Use only for structural isChildOf mutations where walking destination parents reaches the origin item. Missing or cross-document parents use case:missing_parent instead.Do not use for another failure category or without requestId and traceId.
case:missing_parentA CFItem has no active structural isChildOf parent or references a missing parent.Use when a CFItem placement omits its one active parent, references no active same-document CFDocument/CFItem, or has duplicate active parents. Use case:association_cycle when the parent exists but creates a loop.Do not use for another failure category or without requestId and traceId.
case:idempotency_conflictThe same Idempotency-Key was reused with different method, route, or request body hash.Use when the key is syntactically valid and already recorded for this tenant but the replay does not match the stored request fingerprint. Use case:package_import_failed for package row validation errors.Do not use for another failure category or without requestId and traceId.
case:precondition_requiredA mutable route required If-Match and the request omitted it.Use for PUT, PATCH, or DELETE on ETag-protected resources when no If-Match header is present. Use case:precondition_failed when the header is present but stale.Do not use for another failure category or without requestId and traceId.
case:precondition_failedThe supplied If-Match validator no longer matches the current row.Use when the client supplied If-Match but it differs from the current strong ETag. Use case:precondition_required only for missing validators.Do not use for another failure category or without requestId and traceId.
case:package_import_failedA CFPackage failed validation or atomic import.Use when package-level validation, graph validation, or atomic commit fails and rowErrors describe the failing package paths. Use case:validation_failed for ordinary per-resource payload errors.Do not use for another failure category or without requestId and traceId.
case:resource_referencedHTTP 409: a requested soft-retire/delete would leave an active CASE relationship or CASE-local component reference pointing at the retired resource.Use when DELETE or a raw retired_at update targets an active CFDocument or ordinary CFItem still referenced by an active CASE item, association, Alignment, or CASE-local component reference. Under CITD-019, opaque registry KC extension fields are not CASE retirement blockers.Do not use for another failure category or without requestId and traceId.
case:legacy_kc_read_onlyHTTP 409: a post-#707 request attempted to mutate a retained legacy CASE Knowledge Component or one of its four governed legacy relationship types.Use only for retained legacy Knowledge Component CFItem writes and precedes, ext:alpha.needs_first, replacedBy, or exactMatchOf relationship writes. Reads remain available; other stock CASE association types keep normal behavior.Used for active registry-native KC authoring (owned by Curriculum), for an ordinary CASE CFItem, or for a stock CASE relationship outside the exact four governed legacy types.
case:server_errorHTTP 500: the CASE API could not complete the documented operation.Use only for unexpected server failures after request validation and known conflict handling. The response must include requestId and traceId for support correlation and must not expose raw database errors.Do not use for another failure category or without requestId and traceId.

case_scope

CASE JWT scopes · field JWT.scopes[]

ValueMeaningUse whenInvalid when
case:readRead CFDocuments, CFItems, CFAssociations, CFPackage exports, support definitions, and Alignments.Grant to clients that browse standards, resolve external IDs, follow graph edges, or export packages without mutating CASE rows.Missing from a route that requires it, misspelled, or used as a substitute for tenantId enforcement.
case:writeCreate and edit per-resource CFDocument, CFItem, CFAssociation, and Alignment rows.Grant to authoring clients that use per-resource POST, PUT, PATCH, or DELETE. Do not rely on it for CFPackage import without case:import.Missing from a route that requires it, misspelled, or used as a substitute for tenantId enforcement.
case:importImport CFPackages and run package-level writes.Grant to package loader jobs that call POST /CFPackages and need atomic package persistence. Pair with case:read for post-import verification.Missing from a route that requires it, misspelled, or used as a substitute for tenantId enforcement.
case:adminAdministrative override scope for destructive or audit-sensitive CASE operations.Reserve for audit views, retained tombstones, repair jobs, or policy exceptions that ordinary read/write/import clients must not reach.Missing from a route that requires it, misspelled, or used as a substitute for tenantId enforcement.

case_framework_type

CFDocument frameworkType · field case.cf_document.framework_type

ValueMeaningUse whenInvalid when
CourseCodesPredefined CASE 1.1 framework type for a course-code framework.Use when the CFDocument represents course codes rather than academic standards or competencies.Used as a generic default for every standards framework. Null is better when the publisher does not name a framework type.
publisher-defined normalized stringA standards publisher's type label for a framework when it is not the predefined CourseCodes value.Use only when preserving a publisher's CASE 1.1 payload or authoritative metadata.Contains control characters, leading/trailing whitespace, or is invented by platform3 instead of the publisher.

Reconstructed SQL guidance

sqlSections preserve the previously deployed June 11 documentation for reconciliation. They are not an executable migration source; each generated artifact binds the exact tracked DDL hashes, and stale excerpts are labeled instead of silently presented as current.

Tenant RLS contract

Direct Postgres roles should enforce the same text tenant_id boundary the API derives from the HS256 bearer JWT.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create schema if not exists "case";

create or replace function "case".current_tenant_id()
returns text
language sql
stable
as $$
  select nullif(current_setting('app.tenant_id', true), '')::text
$$;

-- Run this block after the CREATE TABLE statements if a direct DB role will read/write CASE rows.
do $$
declare
  table_name text;
  policy_name text;
begin
  foreach table_name in array array[
    'cf_document',
    'cf_item',
    'cf_association',
    'alignment',
    'cf_package_import',
    'cf_concept',
    'cf_subject',
    'cf_license',
    'cf_item_type',
    'cf_association_grouping',
    'cf_rubric',
    'cf_rubric_criterion',
    'cf_rubric_criterion_level'
  ]
  loop
    policy_name := table_name || '_tenant_isolation';
    execute format('alter table "case".%I enable row level security', table_name);
    execute format('drop policy if exists %I on "case".%I', policy_name, table_name);
    execute format(
      'create policy %I on "case".%I using (tenant_id = "case".current_tenant_id()) with check (tenant_id = "case".current_tenant_id())',
      policy_name,
      table_name
    );
  end loop;
end $$;

CREATE TABLE case.cf_document

Live physical storage for CFDocument. CASE fields live in body JSONB; tenant/id/resource_type/import/version/etag/timestamps/retired_at are sidecar columns.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_document (
  tenant_id text not null,
  id text not null,
  resource_type text not null default 'cf_document',
  import_batch_id text not null,
  body jsonb not null,
  version integer not null default 1,
  etag text not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  retired_at timestamptz,
  primary key (tenant_id, id)
);

create index if not exists cf_document_uri_idx
  on "case".cf_document (tenant_id, (body->>'uri'))
  where retired_at is null;
create index if not exists cf_document_updated_idx
  on "case".cf_document (tenant_id, updated_at desc)
  where retired_at is null;

-- Required CASE fields are validated by the API before insert:
-- body->>'identifier', body->>'uri', body->>'creator', body->>'title', body->>'lastChangeDateTime'.

CREATE TABLE case.cf_item

Live physical storage for CFItem. The required CFDocumentURI and parentIdentifier write contract is in body JSONB, not flat columns.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_item (
  tenant_id text not null,
  id text not null,
  resource_type text not null default 'cf_item',
  import_batch_id text not null,
  body jsonb not null,
  version integer not null default 1,
  etag text not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  retired_at timestamptz,
  primary key (tenant_id, id)
);

create index if not exists cf_item_document_idx
  on "case".cf_item (tenant_id, (body->>'CFDocumentURI'), (body->>'parentIdentifier'))
  where retired_at is null;
create index if not exists cf_item_document_identifier_idx
  on "case".cf_item (tenant_id, (body->>'cfDocumentIdentifier'))
  where retired_at is null;
create index if not exists cf_item_uri_idx
  on "case".cf_item (tenant_id, (body->>'uri'))
  where retired_at is null;
create index if not exists cf_item_updated_idx
  on "case".cf_item (tenant_id, updated_at desc)
  where retired_at is null;

-- Required CFItem write fields are validated by the API before insert:
-- body->>'identifier', body->>'uri', body->>'fullStatement',
-- body->'CFDocumentURI' with identifier/uri, and body->>'parentIdentifier'.

CREATE TABLE case.cf_association

Live physical storage for typed CASE graph edges. Endpoint projections are JSONB paths in body.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_association (
  tenant_id text not null,
  id text not null,
  resource_type text not null default 'cf_association',
  import_batch_id text not null,
  body jsonb not null,
  version integer not null default 1,
  etag text not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  retired_at timestamptz,
  primary key (tenant_id, id)
);

create index if not exists cf_association_origin_idx
  on "case".cf_association (tenant_id, (body->'originNodeURI'->>'identifier'))
  where retired_at is null;
create index if not exists cf_association_destination_idx
  on "case".cf_association (tenant_id, (body->'destinationNodeURI'->>'identifier'))
  where retired_at is null;
create index if not exists cf_association_origin_identifier_idx
  on "case".cf_association (tenant_id, (body->>'originIdentifier'))
  where retired_at is null;
create index if not exists cf_association_destination_identifier_idx
  on "case".cf_association (tenant_id, (body->>'destinationIdentifier'))
  where retired_at is null;
create index if not exists cf_association_type_idx
  on "case".cf_association (tenant_id, (body->>'associationType'))
  where retired_at is null;

CREATE TABLE case.alignment

Live physical storage for external-ID mappings. There is no deleted_at column; active rows use retired_at is null and public DELETE hard-deletes.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".alignment (
  tenant_id text not null,
  id text not null,
  resource_type text not null default 'alignment',
  import_batch_id text not null,
  body jsonb not null,
  version integer not null default 1,
  etag text not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  retired_at timestamptz,
  primary key (tenant_id, id)
);

create unique index if not exists alignment_active_external_id_idx
  on "case".alignment (tenant_id, (body->>'externalSystem'), (body->>'externalId'))
  where retired_at is null;

-- body fields validated by the API: alignmentId, externalSystem, externalId,
-- and at least one resolvable CFItem target in cfItemIdentifier or cfItemUri.

Retire reference guard trigger

Live guardrail for CFDocument/CFItem soft-retire. The API surfaces this as HTTP 409 case:resource_referenced; raw DB migrations must install the same trigger so direct retired_at updates cannot strand active references.

superseded-by-issues-707-and-1721 — Do not execute this reconstructed trigger excerpt. The tracked CASE DDL and the post-#707 release operator own the exact retirement guard.

Review reconstructed SQL excerpt
-- The exact superseded trigger bytes remain reviewable in loop/case/artifacts/1edtech/data_dictionary/source/reconstruction/deployed-case-data-dictionary-20260723.json (sqlSections#retire-reference-trigger).
-- Do not execute reconstructed snapshot SQL. Use loop/case/artifacts/1edtech/implementation/impl/migrations/001_case_core.sql, loop/case/artifacts/1edtech/implementation/impl/src/migrations/caseSchema.mjs, and the reviewed post-#707 release operator.

CREATE TABLE case.cf_package_import

Live physical storage for CFPackage import evidence. This control table is flat because it is platform audit state, not a CASE resource body.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_package_import (
  tenant_id text not null,
  id text not null,
  import_batch_id text not null,
  document_identifier text not null,
  package_hash text not null,
  source_uri text,
  status text not null check (status in ('pending', 'succeeded', 'failed')),
  row_counts jsonb not null default '{}'::jsonb,
  row_errors jsonb,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  committed_at timestamptz,
  primary key (tenant_id, id)
);

create index if not exists cf_package_import_hash_idx
  on "case".cf_package_import (tenant_id, document_identifier, package_hash);

CREATE TABLE imported CFDefinitions resources

CFConcept, CFSubject, CFLicense, CFItemType, CFAssociationGrouping, and CFRubric use the same JSONB-body physical shape.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_concept (
  tenant_id text not null,
  id text not null,
  resource_type text not null default 'cf_concept',
  import_batch_id text,
  body jsonb not null,
  version integer not null default 1,
  etag text not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  retired_at timestamptz,
  primary key (tenant_id, id)
);

-- Repeat this shape for cf_subject, cf_license, cf_item_type,
-- cf_association_grouping, and cf_rubric, changing only resource_type default
-- and table name. Reads are tenant-scoped; package export scopes definitions
-- by import_batch_id rather than by retired_at.

CREATE TABLE rubric child rows

Rubric criteria and criterion levels use parent-key columns plus body JSONB because CASE packages nest them under a CFRubric.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
create table if not exists "case".cf_rubric_criterion (
  tenant_id text not null,
  rubric_id text not null,
  id text not null,
  body jsonb not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  primary key (tenant_id, rubric_id, id)
);

create table if not exists "case".cf_rubric_criterion_level (
  tenant_id text not null,
  rubric_id text not null,
  criterion_id text not null,
  id text not null,
  body jsonb not null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now(),
  primary key (tenant_id, rubric_id, criterion_id, id)
);

Tenant-scoped CFItem hierarchy query

Walk the active CFItem tree for one CFDocument using body->>'parentIdentifier' and body->>'cfDocumentIdentifier', without reading source code.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
with recursive item_tree as (
  select
    i.tenant_id,
    i.id as identifier,
    i.body->>'parentIdentifier' as parent_identifier,
    coalesce(i.body->>'cfDocumentIdentifier', i.body->'CFDocumentURI'->>'identifier') as cf_document_identifier,
    i.body->>'humanCodingScheme' as human_coding_scheme,
    i.body->>'fullStatement' as full_statement,
    i.body->>'listEnumeration' as list_enumeration,
    0 as depth,
    array[i.id] as path
  from "case".cf_item i
  where i.tenant_id = $1::text
    and coalesce(i.body->>'cfDocumentIdentifier', i.body->'CFDocumentURI'->>'identifier') = $2::text
    and i.body->>'parentIdentifier' = $2::text
    and i.retired_at is null

  union all

  select
    child.tenant_id,
    child.id,
    child.body->>'parentIdentifier',
    coalesce(child.body->>'cfDocumentIdentifier', child.body->'CFDocumentURI'->>'identifier'),
    child.body->>'humanCodingScheme',
    child.body->>'fullStatement',
    child.body->>'listEnumeration',
    item_tree.depth + 1,
    item_tree.path || child.id
  from "case".cf_item child
  join item_tree
    on item_tree.tenant_id = child.tenant_id
   and item_tree.identifier = child.body->>'parentIdentifier'
  where child.retired_at is null
    and child.id <> all(item_tree.path)
)
select depth, human_coding_scheme, identifier, parent_identifier, full_statement
from item_tree
order by path;

Resolve a publisher external ID to a CFItem

Use Alignment as the only tenant-specific external-ID link, then join to the active CASE item row.

reconstructed-deployed-snapshot-2026-06-11 — Use the tracked, hash-bound CASE DDL for execution; this excerpt is retained so reconstruction differences remain reviewable.

Review reconstructed SQL excerpt
select
  a.body->>'externalSystem' as external_system,
  a.body->>'externalId' as external_id,
  i.id as cf_item_identifier,
  i.body->>'uri' as cf_item_uri,
  i.body->>'humanCodingScheme' as human_coding_scheme,
  i.body->>'fullStatement' as full_statement,
  coalesce(i.body->>'cfDocumentIdentifier', i.body->'CFDocumentURI'->>'identifier') as cf_document_identifier
from "case".alignment a
join "case".cf_item i
  on i.tenant_id = a.tenant_id
 and (
   i.id = a.body->>'cfItemIdentifier'
   or i.body->>'uri' = a.body->>'cfItemUri'
 )
where a.tenant_id = $1::text
  and a.body->>'externalSystem' = $2
  and a.body->>'externalId' = $3
  and a.retired_at is null
  and i.retired_at is null;

Provenance and exact hashes

Canonical source: loop/case/artifacts/1edtech/data_dictionary/source/case-data-dictionary-source.json
Source SHA-256: 2388c34481a3cb57d8734aa390775b7ff74887c295c9fd83fcd1dfb8b2b9aff8
Reconciliation SHA-256: a1d8c356e3ceb26138fd562ef2c84c5b2c388f641863cab342813677332579d4

{
  "architecture": "e3e4a4e9d2e127c10e191249849b3683715b33dcb9e616f9d9fc958b8b45f869",
  "migration": "a9b81cb6e001ae3ae261a78987e5dafdcf14052f27ede753e04ce24d01e35c56",
  "runtimeSchema": "7eb36416212515f01c1a82df2d48f8c2819b5373eebb38a7bf0fd892bdb3c98b",
  "officialOpenApi": "40f183b6ca3ce4979e4908d4414b9d099dd22493bea45694b60e7a72a19a22bf",
  "provenance": "a718f67352809a8e275bf4e03aeeec25d8a36d20f9b7dd8b00d61e39d39b452f",
  "implementationVercel": "9203ad73e5fdb4ccf3a8639cbd6dd5feec126318ed5404d291bde1d9c0f8437a",
  "deployedSnapshot": "838632479b5ff201b7791193dc78b89112847c8e35aad81a47b7d75070f5baba"
}

Captured deployed JSON: https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/data_dictionary/case-data-dictionary.json · SHA-256 838632479b5ff201b7791193dc78b89112847c8e35aad81a47b7d75070f5baba