Object index
Use this index or the search box to jump to a table or field. Every field row has a stable anchor.
qti.tenant
Tenant
4 fields - Platform isolation root for schools, districts, publishers, or applications using the QTI surface.
qti.content_package
Content package
10 fields - One imported IMS Content Package or loose XML bundle, scoped to a tenant.
qti.package_resource
Package resource
7 fields - IMS manifest resource row with resource identifiers, type, href, dependencies, and metadata.
qti.package_file
Package file
10 fields - Original file bytes from an imported IMS/QTI package.
qti.artifact
Artifact
10 fields - Stable logical QTI document or package artifact across immutable versions.
qti.artifact_version
Artifact version
16 fields - Immutable XML, generated object graph, projections, and trace for one saved artifact edition.
qti.component
Component
14 fields - Lossless relational projection of generated QTI object-graph nodes.
qti.variable_declaration
Variable declaration
11 fields - Typed query projection for QTI response, outcome, template, and context variables.
qti.processing_rule
Processing rule
9 fields - Executable QTI processing and expression tree projection.
qti.delivery_session
Delivery session
9 fields - Candidate delivery snapshot against one immutable root artifact version.
qti.attempt
Attempt
12 fields - Candidate response, template, outcome, and processing trace snapshot inside a delivery session.
qti.conformance_run
Conformance run
8 fields - Release evidence for a QTI conformance/profile run.
qti.conformance_assertion
Conformance assertion
7 fields - Per-example and per-feature conformance evidence.
qti.tenant
Platform isolation root for schools, districts, publishers, or applications using the QTI surface.
Purpose
A tenant owns QTI content, delivery sessions, attempts, and API access. QTI does not define tenancy, so this table is the platform boundary that keeps one customer's content and learner-runtime data separate from another's.
Lifecycle
Created before package ingest or delivery. Content packages, artifacts, sessions, and attempts point back to a tenant. Deleting a tenant is outside this package's normal workflow; learner-runtime deletion is done by candidate_ref instead.
Trace
ITD-008 Tenant Boundary, ITD-019 Security Boundary
QTI defines assessment interchange content, not multi-tenant platform isolation.
Relationships
- Parent of qti.content_package, qti.artifact, and qti.delivery_session.
Integrity rules
- tenant_key is unique across the platform.
- Every tenant-owned API route must match the authenticated tenant claim.
Invalid examples
- A row with a tenant_id that is not a valid UUID.
- A duplicate tenant_key.
- Using a tenant row to store school PII or learner identity fields.
Example row
{
"tenant_id": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
"tenant_key": "north-valley",
"display_name": "North Valley School District",
"created_at": "2026-05-20T12:30:00Z"
}
Common queries
select tenant_id from qti.tenant where tenant_key = 'north-valley';insert into qti.tenant (tenant_id, tenant_key, display_name) values ($1, $2, $3);
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
tenant_id
Primary key
|
uuidRequired; no default
|
Stable platform identifier for one tenant boundary. |
Must be a valid PostgreSQL UUID and unique as the primary key. Invalid when: Not parseable as UUID, reused by another tenant, or copied into QTI XML as assessment content. |
Platform gap fill
Platform isolation identifier. |
None. Example: |
tenant_key
Unique
|
textRequired; no default
|
Human-stable lookup key for operations, logs, and local tooling. |
Unique across qti.tenant. SQL has no length or charset check; API and migrations should keep it short, stable, and non-secret. Invalid when: Duplicated, empty in API input, used for direct learner identity, or treated as a QTI identifier. |
Platform gap fill
Platform operational key. |
None. Example: |
display_name
|
textRequired; no default
|
Operational display label for the tenant. |
Required text. SQL has no length check; do not use as an authorization key. Invalid when: Null, blank in API input, or used in place of tenant_id for joins. |
Platform gap fill
Platform console metadata. |
None. Example: |
created_at
|
timestamptzRequired; default
now() |
Timestamp when the tenant row was inserted. |
Required timestamp with time zone. Defaults to database now(). Invalid when: Null, manually backdated without migration evidence, or compared as local time without timezone normalization. |
Platform gap fill
Platform audit metadata. |
None. Example: |
qti.content_package
One imported IMS Content Package or loose XML bundle, scoped to a tenant.
Purpose
Records the package-level identity, import lifecycle, manifest identifier, hash, and metadata for an uploaded QTI package. This is where package ingest becomes durable before resources, files, artifacts, and versions are projected.
Lifecycle
Created by package ingest. The row starts as importing, becomes imported after validation/projection, rejected after validation failure, or superseded when later content replaces it operationally.
Trace
ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes, ITD-020 Validation And Rejection Policy
The table is a persistence gap fill. manifest_identifier preserves IMS manifest data when present; package hashes, tenant scope, import state, and idempotency are platform decisions.
Relationships
- Belongs to one qti.tenant.
- Parent of qti.package_resource, qti.package_file, and imported qti.artifact rows.
Integrity rules
- Unique (tenant_id, idempotency_key).
- Unique (tenant_id, package_hash).
- import_status must be one of the documented package lifecycle values.
Invalid examples
- Same tenant imports different bytes with the same idempotency_key.
- package_hash is missing or not the normalized package hash.
- import_status outside importing/imported/rejected/superseded.
Example row
{
"package_id": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
"tenant_id": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
"source_uri": "publisher/grade-6-math/qti.zip",
"idempotency_key": "pkg-upload-2026-05-20-001",
"package_hash": "sha256:6a8c1f58c16f4b0b4f0a0d8c6be8d226e3d5d80f0b2f7d2f49e6d7d9e9d4f1cb",
"manifest_identifier": "MANIFEST-G6-MATH-2026",
"qti_profile": "qti-3.0",
"import_status": "imported",
"metadata": {
"resourceCount": 18,
"fileCount": 42
},
"imported_at": "2026-05-20T13:00:00Z"
}
Common queries
select package_id, import_status from qti.content_package where tenant_id = $1 and package_hash = $2;select package_id from qti.content_package where tenant_id = $1 and idempotency_key = $2;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
package_id
Primary key
|
uuidRequired; no default
|
Stable identifier assigned to one package ingest record. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused across package rows. |
Platform gap fill
Platform package identity. |
None. Example: |
tenant_id
Foreign key
|
uuidRequired; no default
|
Tenant that owns the package and all extracted resources. |
Must reference qti.tenant(tenant_id). Invalid when: References a missing tenant or disagrees with the tenant path in the API request. |
Platform gap fill
Tenant boundary. ITD-008 Tenant Boundary, ITD-009 Package Resource And File Ingest |
Belongs to exactly one qti.tenant; not nullable. Example: |
source_uri
|
textNullable; no default
|
Original filename, URI, or content-addressable reference supplied by the ingest caller. |
Nullable text. It is diagnostic only and must not be used as a trusted package locator after ingest. Invalid when: Used as a primary identity, contains secrets, or points outside tenant authorization. |
Platform gap fill
Operational ingest evidence. |
None. Example: |
idempotency_key
Unique with tenant_id when non-null
|
textNullable; no default
|
Idempotency-Key from the package ingest API so retries return the same package instead of duplicating work. |
Unique with tenant_id. PostgreSQL allows multiple nulls; API ingest should provide a key for client retries. Invalid when: Same tenant reuses the key for different package bytes, or a secret/token is stored here. |
Platform gap fill
HTTP/API idempotency behavior. |
None. Example: |
package_hash
Unique with tenant_id
|
textRequired; no default
|
Cryptographic hash of the normalized package payload used to identify repeated imports. |
Required text and unique with tenant_id. Store the algorithm prefix with the digest, such as sha256:<hex>. Invalid when: Missing, not reproducible from the normalized package, or reused for different bytes in one tenant. |
Platform gap fill
Idempotent persistence and audit. |
None. Example: |
manifest_identifier
|
textNullable; no default
|
IMS manifest identifier copied from imsmanifest when the package has one. |
Nullable because loose XML ingest may not include imsmanifest. If present, preserve the source value without Alpha renaming. Invalid when: Invented when no manifest exists, changed to a platform name, or used as a database primary key. |
1EdTech pass-through
IMS content package manifest identifier. ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
None. Example: |
qti_profile
|
textRequired; default
'qti-3.0' |
Conformance profile asserted for this import. |
Required text. Current default and target profile is qti-3.0; optional feature sets must be explicit and supported by conformance evidence. Invalid when: Unsupported profile string, null, or used to imply the live network spec changed the accepted bundle. |
Platform gap fill
Platform conformance profile label tied to the offline QTI 3.0 bundle. ITD-001 Offline 1EdTech Source Bundle, ITD-017 Conformance Evidence |
None. Example: |
import_status
|
textRequired; default
'imported' |
Current lifecycle state of package ingest. |
Must satisfy content_package_import_status_ck. Invalid when: Outside the enum set or inconsistent with resource/artifact projection state. |
Platform gap fill
Platform package import lifecycle. |
None. Example: |
metadata
|
jsonbRequired; default
'{}'::jsonb |
Generated package-level import evidence such as manifest facts, QTI metadata summaries, counts, validation diagnostics, and vocabulary projections. |
Required JSON object. Do not store package bytes or secrets here; store original bytes in qti.package_file. Invalid when: Null, non-object JSON, direct learner PII, access tokens, or duplicated source XML bytes. |
Platform gap fill
Generated import evidence envelope. ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy |
None. Example: |
imported_at
|
timestamptzRequired; default
now() |
Timestamp when the package row was inserted. |
Required timestamp with time zone. Invalid when: Null or used as the source of content version ordering instead of artifact_version.version_number. |
Platform gap fill
Import audit metadata. |
None. Example: |
qti.package_resource
IMS manifest resource row with resource identifiers, type, href, dependencies, and metadata.
Purpose
Indexes manifest resources from an imported package without rewriting IMS/QTI names. The row lets delivery, authoring, export, and diagnostics find the primary XML or asset files associated with each manifest resource.
Lifecycle
Created during package ingest after manifest parsing and package-closure checks. Deleted when the owning content package is deleted.
Trace
ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy
The row is a persistence gap fill; resource_identifier, resource_type, href, dependencies, and manifest metadata preserve IMS/QTI package values.
Relationships
- Belongs to one qti.content_package.
- May be referenced by qti.package_file and qti.artifact.
Integrity rules
- Unique (package_id, resource_identifier).
- resource_type should be one of the IMS/QTI package resource vocabulary values.
- Package hrefs and dependencies must stay inside the package closure.
Invalid examples
- A resource_identifier duplicated in one package.
- An href that escapes the package root with ../.
- A resource_type not recognized by the source bundle and not marked extension.
Example row
{
"resource_id": "aafcefe4-9814-4d43-93be-556dc38dace0",
"package_id": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
"resource_identifier": "item-RESPONSE-001",
"resource_type": "imsqti_item_xmlv3p0",
"href": "items/response-001.xml",
"dependencies": [
"stimulus-READING-PASSAGE-1"
],
"metadata": {
"files": [
"items/response-001.xml",
"media/chart.png"
]
}
}
Common queries
select resource_identifier, resource_type, href from qti.package_resource where package_id = $1 order by resource_identifier;select resource_id from qti.package_resource where package_id = $1 and resource_identifier = $2;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
resource_id
Primary key
|
uuidRequired; no default
|
Stable identifier for this manifest resource row. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused by another package_resource row. |
Platform gap fill
Platform row identity. |
None. Example: |
package_id
Foreign key
|
uuidRequired; no default
|
Owning content package. |
Must reference qti.content_package(package_id). Cascades on package delete. Invalid when: Missing package, cross-tenant package/resource mixture, or null. |
Platform gap fill
Package ownership boundary. |
Belongs to exactly one qti.content_package. Example: |
resource_identifier
Unique with package_id
|
textRequired; no default
|
IMS manifest resource identifier copied from imsmanifest. |
Required text and unique within the package. Preserve source spelling. Invalid when: Duplicated within a package, rewritten to a platform UUID, or missing when the manifest resource has an identifier. |
1EdTech pass-through
IMS manifest resource identifier. ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
None. Example: |
resource_type
|
textRequired; no default
|
IMS/QTI resource type from the package manifest. |
Required text. Values should match the package resource vocabulary or be explicitly preserved as extension. Invalid when: Blank, invented by Alpha naming, or used to bypass validation. |
1EdTech pass-through
IMS/QTI package resource type value. ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
None. Example: |
href
|
textNullable; no default
|
Package-relative path to the resource's primary file. |
Nullable text. If present, must be normalized and must not escape the package root. Invalid when: Absolute URL for a packaged file, path traversal, unnormalized slashes, or missing package_file for a required primary file. |
1EdTech pass-through
IMS package resource href. ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy |
Usually corresponds to one qti.package_file.package_path. Example: |
dependencies
|
jsonbRequired; default
'[]'::jsonb |
Manifest dependency references and variant resource links generated from the package manifest. |
Required JSON array. Each referenced resource identifier should resolve within the same package. Invalid when: Null, non-array JSON, unresolved dependency, or cross-package dependency not represented as allowed external metadata. |
1EdTech pass-through
IMS package resource dependency references. ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy |
References other qti.package_resource.resource_identifier values within the same package. Example: |
metadata
|
jsonbRequired; default
'{}'::jsonb |
Manifest-derived metadata, file list, and resource facts generated at ingest. |
Required JSON object. Keep generated manifest/resource evidence here; keep raw bytes in qti.package_file. Invalid when: Null, non-object JSON, direct learner PII, auth tokens, or package bytes. |
1EdTech pass-through
IMS manifest resource metadata projection when copied from manifest; generated file inventory remains gap-fill metadata. ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
None. Example: |
qti.package_file
Original file bytes from an imported IMS/QTI package.
Purpose
Preserves the exact package file payloads needed for export, audit, validation diagnostics, and media delivery. This includes imsmanifest XML, QTI XML, media, stylesheets, pronunciation lexicons, metadata XML, and other package assets.
Lifecycle
Created during package ingest for each normalized package path. Deleted when the owning content package is deleted. resource_id is set when a manifest resource first listed the file.
Trace
ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy
The row and file hash are gap fills. package_path and content_bytes preserve package source values.
Relationships
- Belongs to one qti.content_package.
- Optionally points to the qti.package_resource that first listed the file.
Integrity rules
- Unique (package_id, package_path).
- package_path must be normalized and package-relative.
- byte_length must match content_bytes length.
Invalid examples
- Two files with the same normalized package_path in one package.
- package_path escapes package root.
- content_hash does not match content_bytes.
Example row
{
"package_file_id": "30225f0a-949d-49d5-a7fc-e2ea43863e96",
"package_id": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
"resource_id": "aafcefe4-9814-4d43-93be-556dc38dace0",
"package_path": "items/response-001.xml",
"media_type": "application/xml",
"byte_length": 18422,
"content_hash": "sha256:92fb3e7a6e6d1df0e5759bda79b9c5a0459dfb7ccf2e0b9eb81227759df8c371",
"metadata": {
"listedInManifest": true
},
"created_at": "2026-05-20T13:00:01Z"
}
Common queries
select package_path, media_type, byte_length from qti.package_file where package_id = $1 order by package_path;select content_bytes from qti.package_file where package_id = $1 and package_path = $2;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
package_file_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one original package file row. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform file row identity. |
None. Example: |
package_id
Foreign key
|
uuidRequired; no default
|
Owning content package. |
Must reference qti.content_package(package_id). Cascades on package delete. Invalid when: References a missing package or mixes tenants. |
Platform gap fill
Package ownership boundary. |
Belongs to exactly one qti.content_package. Example: |
resource_id
Foreign key
|
uuidNullable; no default
|
Manifest resource that first listed this file, when applicable. |
Nullable. If present, must reference qti.package_resource(resource_id). Set null if the resource row is deleted. Invalid when: References a resource from a different package or tenant. |
Platform gap fill
Platform linkage from manifest resource to file preservation. |
Belongs to zero or one qti.package_resource. Example: |
package_path
Unique with package_id
|
textRequired; no default
|
Normalized package-relative path for this file. |
Required and unique inside package. Must not be absolute or contain traversal that escapes the package root. Invalid when: Contains ../ escape, backslash ambiguity, an absolute scheme, duplicate normalized path, or a path not present in the uploaded package. |
1EdTech pass-through
IMS package-relative file path. ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy |
None. Example: |
media_type
|
textRequired; default
'application/octet-stream' |
Detected or declared media type used for export, diagnostics, and content serving. |
Required text. Use a valid media type string; default is application/octet-stream when unknown. Invalid when: Null, unparseable as a media type, or trusted more than validation of the actual content. |
Platform gap fill
Generated file metadata for platform serving and diagnostics. |
None. Example: |
byte_length
|
integerRequired; no default
|
Original byte length of content_bytes. |
Required integer. Must be zero or positive and equal to the stored bytea length. Invalid when: Negative, null, or mismatched with content_bytes. |
Platform gap fill
Generated package file evidence. |
None. Example: |
content_hash
|
textRequired; no default
|
Cryptographic hash of the original file bytes. |
Required text. Store algorithm prefix with digest; must be reproducible from content_bytes. Invalid when: Missing, digest does not match content_bytes, or algorithm is not recorded. |
Platform gap fill
File-level audit and export integrity evidence. |
None. Example: |
content_bytes
|
byteaRequired; no default
|
Original bytes exactly as accepted from the package for this path. |
Required byte array. Must be preserved for faithful package export and audit. Invalid when: Null, replaced by parsed text only, mutated after ingest, or contains a file that failed package-closure validation. |
1EdTech pass-through
Original package file bytes. ITD-009 Package Resource And File Ingest, ITD-004 XML Authority And Canonical Hashes |
None. Example: |
metadata
|
jsonbRequired; default
'{}'::jsonb |
Generated evidence about the file, such as manifest listing flags, validation role, and extracted diagnostics. |
Required JSON object. Must not replace content_bytes. Invalid when: Null, non-object JSON, auth tokens, direct learner PII, or raw file bytes duplicated as JSON. |
Platform gap fill
Generated file-preservation evidence. ITD-009 Package Resource And File Ingest, ITD-020 Validation And Rejection Policy |
None. Example: |
created_at
|
timestamptzRequired; default
now() |
Timestamp when the file row was inserted. |
Required timestamp with time zone. Invalid when: Null or used as a proxy for QTI content versioning. |
Platform gap fill
Package-file audit metadata. |
None. Example: |
qti.artifact
Stable logical QTI document or package artifact across immutable versions.
Purpose
Represents one logical QTI thing: item, test, section, stimulus, outcome declaration, response processing, result, usage data, metadata, or manifest-only resource. QTI identifiers remain QTI-domain identifiers; artifact_id is the platform identity for version history and APIs.
Lifecycle
Created during ingest or authoring. New edits create qti.artifact_version rows instead of replacing the artifact. latest_version_id is a convenience pointer to the newest version.
Trace
ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values, ITD-004 XML Authority And Canonical Hashes
The artifact row and kind are gap fills. qti_identifier, title, and language pass through when copied from QTI XML or package defaults.
Relationships
- Belongs to one qti.tenant.
- May originate from qti.content_package and qti.package_resource.
- Parent of qti.artifact_version.
Integrity rules
- artifact_kind must satisfy artifact_kind_ck.
- artifact_lookup_idx supports tenant/kind/QTI identifier lookup.
Invalid examples
- Using qti_identifier as a database primary key.
- Changing artifact_kind after versions exist.
- Pointing latest_version_id to a version from another artifact.
Example row
{
"artifact_id": "58612cab-9c46-426c-8c20-0e9f19c807c5",
"tenant_id": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
"package_id": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
"resource_id": "aafcefe4-9814-4d43-93be-556dc38dace0",
"artifact_kind": "item",
"qti_identifier": "RESPONSE-001",
"title": "Linear equations checkpoint",
"language": "en-US",
"latest_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"created_at": "2026-05-20T13:00:02Z"
}
Common queries
select artifact_id, latest_version_id from qti.artifact where tenant_id = $1 and artifact_kind = 'item' and qti_identifier = $2;select artifact_kind, count(*) from qti.artifact where package_id = $1 group by artifact_kind order by artifact_kind;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
artifact_id
Primary key
|
uuidRequired; no default
|
Stable platform identity for one logical artifact across versions. |
Valid UUID and unique primary key. Invalid when: Not a UUID, reused, or derived from a mutable QTI identifier. |
Platform gap fill
Platform logical artifact identity. |
None. Example: |
tenant_id
Foreign key
|
uuidRequired; no default
|
Tenant that owns this artifact. |
Must reference qti.tenant(tenant_id). Invalid when: Missing tenant or different from the owning package tenant. |
Platform gap fill
Tenant ownership boundary. |
Belongs to exactly one qti.tenant. Example: |
package_id
Foreign key
|
uuidNullable; no default
|
Origin package for imported artifacts. |
Nullable for authored loose artifacts. If present, must reference qti.content_package(package_id). Set null if package is deleted. Invalid when: References a package owned by another tenant. |
Platform gap fill
Package origin evidence. ITD-009 Package Resource And File Ingest, ITD-011 Artifact Versioning |
Belongs to zero or one qti.content_package. Example: |
resource_id
Foreign key
|
uuidNullable; no default
|
Origin manifest resource for imported artifacts. |
Nullable for generated or loose artifacts. If present, must reference qti.package_resource(resource_id). Set null if resource is deleted. Invalid when: Resource comes from another package or tenant. |
Platform gap fill
Manifest origin evidence. ITD-009 Package Resource And File Ingest, ITD-011 Artifact Versioning |
Belongs to zero or one qti.package_resource. Example: |
artifact_kind
|
textRequired; no default
|
Repository category derived from QTI root element or manifest resource type. |
Must satisfy artifact_kind_ck. Invalid when: Outside enum set, inconsistent with root_element on versions, or changed for Alpha vocabulary. |
Platform gap fill
Gap-fill classification derived from QTI roots. |
None. Example: |
qti_identifier
|
textNullable; no default
|
QTI identifier attribute copied from the root object when present. |
Nullable because not every artifact has a root identifier. Preserve source spelling; do not use as a globally unique database key. Invalid when: Invented when absent, rewritten to a UUID, or assumed unique outside artifact scope. |
1EdTech pass-through
QTI identifier attribute. ITD-004 XML Authority And Canonical Hashes, ITD-007 Provenance Labels |
None. Example: |
title
|
textNullable; no default
|
QTI title or generated display label when present. |
Nullable. Preserve QTI title when present; generated labels must be distinguishable in metadata/spec trace. Invalid when: Used as identity, translated without retaining source XML, or contains direct learner PII. |
1EdTech pass-through
QTI title or package display metadata when copied from source. ITD-004 XML Authority And Canonical Hashes, ITD-007 Provenance Labels |
None. Example: |
language
|
textNullable; no default
|
xml:lang or package-default language associated with the artifact. |
Nullable BCP 47 language tag when known. Invalid when: Not a language tag, invented without source/default evidence, or used to filter tenant access. |
1EdTech pass-through
xml:lang or package default language. |
None. Example: |
latest_version_id
Convenience pointer
|
uuidNullable; no default
|
Newest immutable artifact version for convenience reads. |
Nullable until a version exists. Must point to a qti.artifact_version for this same artifact when populated. Invalid when: Points to another artifact's version or treated as authoritative history instead of the artifact_version table. |
Platform gap fill
Platform version lookup convenience. |
Points to zero or one qti.artifact_version for the same artifact. Example: |
created_at
|
timestamptzRequired; default
now() |
Logical artifact creation timestamp. |
Required timestamp with time zone. Invalid when: Null or used as version_number. |
Platform gap fill
Artifact audit metadata. |
None. Example: |
qti.artifact_version
Immutable XML, generated object graph, projections, and trace for one saved artifact edition.
Purpose
Binds original XML, canonical XML, generated object graph, public JSON projections, root/schema evidence, and spec trace to one immutable version. This table is the heart of faithful QTI round trips and stable historical delivery.
Lifecycle
Created on ingest or authoring save. Never updated in place except operational metadata that does not change content semantics. New edits append a later version_number.
Trace
ITD-004 XML Authority And Canonical Hashes, ITD-006 JSON Projection Boundaries, ITD-011 Artifact Versioning
Versioning and JSON/object projection storage are gap fills. source_xml, canonical_xml, root_element, root_type, schema_file, and spec_trace preserve or derive from the 1EdTech source bundle.
Relationships
- Belongs to one qti.artifact.
- Parent of qti.component, qti.variable_declaration, qti.processing_rule, qti.delivery_session, and qti.attempt references.
Integrity rules
- Unique (artifact_id, version_number).
- Unique (artifact_id, xml_hash).
- source_xml must validate against bundled schema before persistence.
Invalid examples
- Mutating canonical_xml after attempts exist.
- delivery_json drops an identifier needed for scoring.
- schema_file not in the offline source bundle.
Example row
{
"artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"artifact_id": "58612cab-9c46-426c-8c20-0e9f19c807c5",
"version_number": 1,
"root_element": "qti-assessment-item",
"root_type": "AssessmentItemDType",
"schema_file": "imsqti_itemv3p0p1_v1p0.xsd",
"xml_hash": "sha256:e8a86d190e6d8865c4562b8e8b2b1e299f8a8d37a58c0bb71b35ef28bb62ab31",
"created_by": "system:package-ingest"
}
Common queries
select artifact_version_id, version_number, xml_hash from qti.artifact_version where artifact_id = $1 order by version_number desc;select delivery_json from qti.artifact_version where artifact_version_id = $1;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
artifact_version_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one immutable artifact edition. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform version identity. |
None. Example: |
artifact_id
Foreign key
|
uuidRequired; no default
|
Logical artifact this version belongs to. |
Must reference qti.artifact(artifact_id). Cascades on artifact delete. Invalid when: Missing artifact or cross-tenant mismatch through artifact. |
Platform gap fill
Version belongs to logical artifact identity. |
Belongs to exactly one qti.artifact. Example: |
version_number
Unique with artifact_id
|
integerRequired; no default
|
Forward-only per-artifact version number. |
Required integer and unique with artifact_id. Should increase by one for each saved edition. Invalid when: Zero or negative by convention, duplicated for an artifact, skipped without migration evidence, or reused after rollback. |
Platform gap fill
Immutable version sequencing. |
None. Example: |
source_xml
|
xmlRequired; no default
|
Original XML accepted after bundled XSD/Schematron validation. |
Required PostgreSQL xml. Must validate before object creation and persistence. Invalid when: Malformed XML, not valid against the bundled schema, contains direct learner runtime PII, or differs from the persisted object graph without trace. |
1EdTech pass-through
Original QTI XML accepted from the 1EdTech source format. ITD-004 XML Authority And Canonical Hashes, ITD-020 Validation And Rejection Policy |
None. Example: |
canonical_xml
|
textRequired; no default
|
Canonicalized XML used for equivalence checks and stable export. |
Required text. Must round-trip from object graph to XML and hash to xml_hash. Invalid when: Not reproducible from object_graph, hash mismatch, or changed after delivery sessions point to this version. |
1EdTech pass-through
Canonical QTI XML derived from source XML under platform canonicalization rules. |
None. Example: |
xml_hash
Unique with artifact_id
|
textRequired; no default
|
Hash of canonical_xml used for idempotency and semantic preservation checks. |
Required text and unique with artifact_id. Store algorithm prefix with digest. Invalid when: Does not match canonical_xml, algorithm omitted, or duplicates a prior version for the same artifact. |
Platform gap fill
Platform equivalence and idempotency evidence over QTI XML. ITD-004 XML Authority And Canonical Hashes, ITD-010 Idempotency And Hashes |
None. Example: |
root_element
|
textRequired; no default
|
Root XML element for this version. |
Required text generated from bundled XSD root element catalog. Invalid when: Not present in the bundled root catalog or inconsistent with source_xml. |
1EdTech pass-through
QTI root element from bundled schemas. ITD-004 XML Authority And Canonical Hashes, ITD-002 Generated Object Model Hub |
None. Example: |
root_type
|
textNullable; no default
|
Generated XSD type name for the root element. |
Nullable for roots without generated type evidence; when present, must match bundled XSD generation. Invalid when: Invented type, wrong schema namespace, or mismatch with root_element. |
1EdTech pass-through
Generated XSD root type from bundled QTI schemas. ITD-002 Generated Object Model Hub, ITD-004 XML Authority And Canonical Hashes |
None. Example: |
schema_file
|
textRequired; no default
|
Bundled schema file used as validation authority. |
Required text. Must name a schema in the offline QTI source bundle. Invalid when: Live network schema URL, missing local schema, or schema that does not define the root. |
1EdTech pass-through
Bundled QTI XSD file. ITD-001 Offline 1EdTech Source Bundle, ITD-020 Validation And Rejection Policy |
None. Example: |
object_graph
|
jsonbRequired; no default
|
Canonical generated object-model graph serialized as JSONB for internal persistence. |
Required JSON object. Must preserve element order, attributes, text, tail text, identifiers, namespaces, types, and source trace enough to rebuild canonical XML. Invalid when: Null, non-object JSON, loses mixed-content tail text, loses namespace identity, or becomes a public delivery contract. |
Platform gap fill
Generated internal object graph for persistence; QTI defines XML, not this JSONB envelope. ITD-002 Generated Object Model Hub, ITD-005 Lossless Relational Projection |
None. Example: |
delivery_json
|
jsonbNullable; no default
|
Generated consumer-facing projection used by delivery applications and session snapshots. |
Nullable before projection. May omit only declared authoring-only or diagnostic detail; must preserve identifiers needed for responses, feedback, scoring, accessibility matching, and session replay. Invalid when: Drops response identifiers, scoring dependencies, feedback links, accessibility references, or includes source traces not intended for delivery. |
Platform gap fill
Generated delivery projection; QTI defines source XML, not this public JSON view. ITD-006 JSON Projection Boundaries, ITD-015 Delivery Session Snapshots |
None. Example: |
authoring_json
|
jsonbNullable; no default
|
Generated authoring projection for editors that must preserve all spec-defined fields. |
Nullable before projection. Must round-trip to object_graph with no spec-defined field loss. Invalid when: Lossy, missing extension payloads, missing source trace needed for edits, or used for delivery without declared lossiness. |
Platform gap fill
Generated authoring projection; QTI defines XML, not this editor JSON view. ITD-006 JSON Projection Boundaries, ITD-011 Artifact Versioning |
None. Example: |
spec_trace
|
jsonbRequired; default
'{}'::jsonb |
Generated traceability from classes, fields, and components to XSD/spec anchors. |
Required JSON object. Must point back to the offline source bundle and generated model evidence. Invalid when: Null, non-object JSON, live-only references, or links that cannot be reproduced from the bundle. |
1EdTech pass-through
Generated traceability to bundled XSD/spec sources. ITD-001 Offline 1EdTech Source Bundle, ITD-007 Provenance Labels |
None. Example: |
supersedes_version_id
Foreign key
|
uuidNullable; no default
|
Previous version replaced by this version, when the save was an edit or replacement. |
Nullable. If present, must reference qti.artifact_version(artifact_version_id), normally for the same artifact. Invalid when: Points forward in time, points to another artifact without explicit migration evidence, or creates a cycle. |
Platform gap fill
Platform version history link. |
References zero or one earlier qti.artifact_version. Example: |
created_at
|
timestamptzRequired; default
now() |
Timestamp when this immutable version was created. |
Required timestamp with time zone. Invalid when: Null or mutated to reorder version history. |
Platform gap fill
Version audit metadata. |
None. Example: |
created_by
|
textNullable; no default
|
Principal or system actor that created the version. |
Nullable text. Must be a safe principal label; do not store raw JWTs or secrets. Invalid when: Raw access token, raw JWT subject that identifies a learner, email address, or other direct learner PII. |
Platform gap fill
Platform audit metadata. ITD-019 Security Boundary, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
qti.component
Lossless relational projection of generated QTI object-graph nodes.
Purpose
Stores ordered object-graph nodes so the repository can query, diff, validate, and rehydrate QTI content without making relational rows the source of truth. Promoted query tables are not enough for round trip; component rows preserve the full structural bridge.
Lifecycle
Created whenever an artifact_version object graph is persisted. Deleted when the owning artifact_version is deleted.
Trace
ITD-005 Lossless Relational Projection, ITD-004 XML Authority And Canonical Hashes
The table, row IDs, parent links, ordinal, and path are gap fills. Element names, namespaces, type names, identifiers, attributes, text, tail text, and trace preserve generated QTI values.
Relationships
- Belongs to one qti.artifact_version.
- Self-references parent_component_id.
- Parent of qti.variable_declaration and qti.processing_rule rows.
Integrity rules
- Unique (artifact_version_id, component_path).
- ordinal preserves sibling order.
- component_identifier_idx supports identifier lookup when qti_identifier is present.
Invalid examples
- Two nodes with the same component_path in one version.
- Dropping tail_value for mixed content.
- Parent link creates a cycle.
Example row
{
"component_id": "c09956ea-d444-42b7-9e36-37f948a8c4f7",
"artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"parent_component_id": null,
"ordinal": 0,
"element_name": "qti-assessment-item",
"qualified_name": "{http://www.imsglobal.org/xsd/imsqtiasi_v3p0}qti-assessment-item",
"namespace_uri": "http://www.imsglobal.org/xsd/imsqtiasi_v3p0",
"type_name": "AssessmentItemDType",
"qti_identifier": "RESPONSE-001",
"component_path": "$",
"attributes": {
"identifier": "RESPONSE-001",
"title": "Linear equations checkpoint"
},
"source_trace": {
"schemaFile": "imsqti_itemv3p0p1_v1p0.xsd"
}
}
Common queries
select component_path, element_name, qti_identifier from qti.component where artifact_version_id = $1 order by component_path;select * from qti.component where artifact_version_id = $1 and qti_identifier = 'SCORE';
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
component_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one generated object node row. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform row identity. |
None. Example: |
artifact_version_id
Foreign key
|
uuidRequired; no default
|
Artifact version containing this component. |
Must reference qti.artifact_version(artifact_version_id). Cascades on version delete. Invalid when: Missing version or cross-artifact projection. |
Platform gap fill
Projection belongs to immutable version. ITD-005 Lossless Relational Projection, ITD-011 Artifact Versioning |
Belongs to exactly one qti.artifact_version. Example: |
parent_component_id
Self foreign key
|
uuidNullable; no default
|
Parent object node, preserving the XML/object hierarchy. |
Nullable for root node. If present, references qti.component(component_id) and cascades on parent delete. Invalid when: Parent is in a different artifact_version, creates a cycle, or is missing for non-root nodes. |
Platform gap fill
Relational hierarchy projection. |
References zero or one parent qti.component. Example: |
ordinal
|
integerRequired; no default
|
Sibling order under parent_component_id. |
Required integer. Use zero-based or one-based consistently in the repository; order must be stable for XML canonicalization. Invalid when: Null, negative by repository convention, duplicated among siblings without deterministic tie-break, or changed after hashing. |
Platform gap fill
Relational ordering needed for round trip. ITD-005 Lossless Relational Projection, ITD-004 XML Authority And Canonical Hashes |
None. Example: |
element_name
|
textRequired; no default
|
XML element name generated from the bundled XSD index. |
Required text. Must match the generated object node and source XML. Invalid when: Unknown to the generated model, mismatched with qualified_name, or rewritten to an Alpha name. |
1EdTech pass-through
QTI/XML element name from bundled XSD index. ITD-002 Generated Object Model Hub, ITD-005 Lossless Relational Projection |
None. Example: |
qualified_name
|
textNullable; no default
|
Clark-notation qualified XML name used to preserve namespace identity. |
Nullable for nodes without namespace evidence; when present, must combine namespace_uri and element_name correctly. Invalid when: Namespace does not match namespace_uri, prefix-only value loses URI, or generated from live schema outside the bundle. |
1EdTech pass-through
Qualified XML name preserving namespace identity. ITD-004 XML Authority And Canonical Hashes, ITD-005 Lossless Relational Projection |
None. Example: |
namespace_uri
|
textNullable; no default
|
Namespace URI for this XML component, if any. |
Nullable text. Must be the actual XML namespace URI, not an arbitrary prefix. Invalid when: Prefix instead of URI, wrong QTI namespace, or discarded for namespaced elements. |
1EdTech pass-through
Namespace URI from QTI/XML content. |
None. Example: |
type_name
|
textNullable; no default
|
Generated XSD type name for this object node. |
Nullable. If present, must match generated type evidence from the bundled schema. Invalid when: Invented type, type from the wrong namespace, or inconsistent with element_name. |
1EdTech pass-through
Generated XSD type name. ITD-002 Generated Object Model Hub, ITD-005 Lossless Relational Projection |
None. Example: |
qti_identifier
|
textNullable; no default
|
QTI identifier attribute on this component when present. |
Nullable. Preserve source value; identifier scope is QTI-defined and not always global. Invalid when: Invented, coerced to UUID, or assumed globally unique across artifacts. |
1EdTech pass-through
QTI identifier attribute. ITD-004 XML Authority And Canonical Hashes, ITD-007 Provenance Labels |
None. Example: |
component_path
Unique with artifact_version_id
|
textRequired; no default
|
Stable generated path from the root object to this component. |
Required and unique within artifact_version_id. Must be reproducible from the generated object graph. Invalid when: Not stable across rehydration, duplicated, or encodes tenant/private data. |
Platform gap fill
Platform traceability and diff path. |
None. Example: |
attributes
|
jsonbRequired; default
'{}'::jsonb |
Raw generated attribute projection for fields not promoted to typed query tables. |
Required JSON object. Must preserve QTI/XML attributes, including extension attributes, without changing names. Invalid when: Null, non-object JSON, drops data-* extension attributes, or stores API auth headers. |
1EdTech pass-through
Raw QTI/XML attributes not promoted to query columns. ITD-004 XML Authority And Canonical Hashes, ITD-005 Lossless Relational Projection |
None. Example: |
text_value
|
textNullable; no default
|
Text node value for text-bearing QTI and embedded content nodes. |
Nullable text. Preserve source text needed for canonical XML round trip. Invalid when: Dropped for mixed content, normalized in a way that changes semantics, or used to store learner responses. |
1EdTech pass-through
Text node value from QTI or permitted embedded content. ITD-004 XML Authority And Canonical Hashes, ITD-005 Lossless Relational Projection |
None. Example: |
tail_value
|
textNullable; no default
|
Tail text after this element, required for mixed-content XML round trips. |
Nullable text. Must be preserved when XML mixed content uses tail text. Invalid when: Dropped because it is inconvenient, moved into text_value incorrectly, or included in delivery_json without declared lossiness. |
1EdTech pass-through
Mixed-content XML tail text needed for round trips. ITD-004 XML Authority And Canonical Hashes, ITD-005 Lossless Relational Projection |
None. Example: |
source_trace
|
jsonbRequired; default
'{}'::jsonb |
Generated trace to XSD and spec source for this component. |
Required JSON object. Must be reproducible from the offline source bundle and generated model. Invalid when: Null, non-object JSON, live-only link, or not aligned with element_name/type_name. |
1EdTech pass-through
Generated traceability to bundled XSD/spec sources. ITD-001 Offline 1EdTech Source Bundle, ITD-007 Provenance Labels |
None. Example: |
qti.variable_declaration
Typed query projection for QTI response, outcome, template, and context variables.
Purpose
Promotes QTI variable declarations into queryable rows so processing, delivery, validation, and reporting can find variables without scanning the full object graph. The object graph remains the reconstruction source.
Lifecycle
Created when an artifact_version object graph is projected. Deleted when the owning artifact_version or component is deleted.
Trace
ITD-013 Variable Declaration Projection, ITD-021 Runtime Execution Profile
The table and row identity are gap fills. Variable kind, identifier, cardinality, base type, default/correct values, mapping, and source trace preserve generated QTI values.
Relationships
- Belongs to one qti.artifact_version.
- References the qti.component that declared the variable.
Integrity rules
- Unique (artifact_version_id, variable_kind, identifier).
- variable_kind must satisfy variable_kind_ck.
- Cardinality and base_type must match QTI declaration semantics when present.
Invalid examples
- Two response declarations with the same identifier in one version.
- Cardinality value outside QTI cardinality vocabulary.
- correct_response shape inconsistent with cardinality/base_type.
Example row
{
"variable_declaration_id": "0c6f5271-9d9e-4df1-8d5d-2ad59dacde66",
"artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"component_id": "7293a5f9-55a9-42cb-b8e6-a2be7d166d35",
"variable_kind": "response",
"identifier": "RESPONSE",
"cardinality": "single",
"base_type": "identifier",
"correct_response": {
"values": [
"choiceA"
]
},
"source_trace": {
"element": "qti-response-declaration"
}
}
Common queries
select identifier, cardinality, base_type from qti.variable_declaration where artifact_version_id = $1 and variable_kind = 'response';select * from qti.variable_declaration where identifier = 'SCORE' and variable_kind = 'outcome';
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
variable_declaration_id
Primary key
|
uuidRequired; no default
|
Stable row identifier for one promoted variable declaration. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform projection row identity. |
None. Example: |
artifact_version_id
Foreign key
|
uuidRequired; no default
|
Artifact version that declares the variable. |
Must reference qti.artifact_version(artifact_version_id). Cascades on version delete. Invalid when: Missing version or mismatch with component_id artifact_version. |
Platform gap fill
Variable projection belongs to immutable content version. ITD-013 Variable Declaration Projection, ITD-011 Artifact Versioning |
Belongs to exactly one qti.artifact_version. Example: |
component_id
Foreign key
|
uuidRequired; no default
|
Component node that declared this variable. |
Must reference qti.component(component_id). Cascades on component delete. Invalid when: Component is not in the same artifact_version or is not a variable declaration node. |
Platform gap fill
Projection link back to object graph component. ITD-005 Lossless Relational Projection, ITD-013 Variable Declaration Projection |
Belongs to exactly one qti.component. Example: |
variable_kind
|
textRequired; no default
|
QTI variable category. |
Must satisfy variable_kind_ck. Invalid when: Outside enum set or used to invent a platform-only variable category. |
1EdTech pass-through
QTI variable declaration category. ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels |
None. Example: |
identifier
Unique with artifact_version_id and variable_kind
|
textRequired; no default
|
QTI variable identifier. |
Required text. Unique with artifact_version_id and variable_kind. Invalid when: Blank, duplicated within kind/version, rewritten to UUID, or mismatched with processing operands. |
1EdTech pass-through
QTI variable identifier value. ITD-013 Variable Declaration Projection, ITD-004 XML Authority And Canonical Hashes |
None. Example: |
cardinality
|
textNullable; no default
|
QTI cardinality for the variable value container. |
Nullable only when the source declaration allows absence. When present, use QTI cardinality values such as single, multiple, ordered, or record. Invalid when: Outside QTI cardinality vocabulary, inconsistent with associated interaction, or inconsistent with JSON value shape. |
1EdTech pass-through
QTI cardinality value. ITD-013 Variable Declaration Projection, ITD-021 Runtime Execution Profile |
None. Example: |
base_type
|
textNullable; no default
|
QTI base-type for atomic values when the declaration has one. |
Nullable for record variables or declarations where QTI permits no base-type. Values should be QTI base types such as boolean, directedPair, duration, file, float, identifier, integer, pair, point, string, or uri. Invalid when: Outside QTI base-type vocabulary, present for record in a way QTI forbids, or inconsistent with correct_response/default_value. |
1EdTech pass-through
QTI base-type value. ITD-013 Variable Declaration Projection, ITD-021 Runtime Execution Profile |
None. Example: |
default_value
|
jsonbNullable; no default
|
Generated object value for qti-default-value. |
Nullable. JSON shape must match cardinality and base_type. Invalid when: Shape does not match cardinality/base_type, contains unvalidated extension payload, or is used as candidate response state. |
1EdTech pass-through
Generated value for qti-default-value. ITD-013 Variable Declaration Projection, ITD-004 XML Authority And Canonical Hashes |
None. Example: |
correct_response
|
jsonbNullable; no default
|
Generated object value for qti-correct-response. |
Nullable. JSON shape must match cardinality and base_type and preserve mapped identifiers exactly. Invalid when: Correct response values are coerced, ordered values are stored as unordered, or value type conflicts with base_type. |
1EdTech pass-through
Generated value for qti-correct-response. ITD-013 Variable Declaration Projection, ITD-021 Runtime Execution Profile |
None. Example: |
mapping
|
jsonbNullable; no default
|
Generated mapping, areaMapping, matchTable, or interpolationTable detail. |
Nullable. Must preserve QTI mapping values, bounds, default scores, and interpolation details needed by processing. Invalid when: Drops default mapping value, loses area coordinates, changes scoring numeric precision, or omits source trace. |
1EdTech pass-through
Generated QTI mapping/detail payload. ITD-013 Variable Declaration Projection, ITD-021 Runtime Execution Profile |
None. Example: |
source_trace
|
jsonbRequired; default
'{}'::jsonb |
Generated trace to XSD and spec section for the variable declaration. |
Required JSON object and reproducible from the source bundle. Invalid when: Null, non-object JSON, or not tied to the declaring component. |
1EdTech pass-through
Generated trace to XSD and spec section. ITD-001 Offline 1EdTech Source Bundle, ITD-007 Provenance Labels |
None. Example: |
qti.processing_rule
Executable QTI processing and expression tree projection.
Purpose
Promotes response, outcome, template, and expression nodes into ordered rows for execution, coverage, diagnostics, and trace generation. The rule_name and operands remain generated QTI values; the row scope and sequence are platform execution aids.
Lifecycle
Created when an artifact_version object graph is projected. Deleted when the owning artifact_version or component is deleted.
Trace
ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile
The table, row IDs, parent links, scope, and sequence are gap fills. rule_name, operands, and source_trace preserve generated QTI processing data.
Relationships
- Belongs to one qti.artifact_version.
- References the qti.component backing the rule.
- Self-references parent_processing_rule_id for nested rule/expression trees.
Integrity rules
- rule_scope must satisfy processing_rule_scope_ck.
- processing_rule_execution_idx orders rules by artifact_version_id, rule_scope, and sequence_number.
Invalid examples
- sequence_number does not match object-graph order.
- rule_name not generated from a QTI processing element.
- unregistered custom operator treated as successful execution.
Example row
{
"processing_rule_id": "74b1c279-e85f-407e-971e-16408ad792c0",
"artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"component_id": "913a57f5-98a5-4726-940b-d9610b721ccb",
"parent_processing_rule_id": null,
"rule_scope": "response",
"rule_name": "qti-map-response",
"sequence_number": 10,
"operands": [
{
"variableIdentifier": "RESPONSE"
}
],
"source_trace": {
"element": "qti-map-response"
}
}
Common queries
select rule_scope, sequence_number, rule_name from qti.processing_rule where artifact_version_id = $1 order by rule_scope, sequence_number;select * from qti.processing_rule where artifact_version_id = $1 and rule_scope = 'response';
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
processing_rule_id
Primary key
|
uuidRequired; no default
|
Stable row identifier for one promoted processing rule or expression node. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform projection row identity. |
None. Example: |
artifact_version_id
Foreign key
|
uuidRequired; no default
|
Artifact version containing the processing rule. |
Must reference qti.artifact_version(artifact_version_id). Cascades on version delete. Invalid when: Missing version or mismatch with component_id artifact_version. |
Platform gap fill
Processing projection belongs to immutable content version. ITD-014 Processing Rule Projection, ITD-011 Artifact Versioning |
Belongs to exactly one qti.artifact_version. Example: |
component_id
Foreign key
|
uuidRequired; no default
|
Component node backing this processing rule. |
Must reference qti.component(component_id). Cascades on component delete. Invalid when: Component is not in the same artifact_version or is not a processing/expression node. |
Platform gap fill
Projection link back to generated component. ITD-005 Lossless Relational Projection, ITD-014 Processing Rule Projection |
Belongs to exactly one qti.component. Example: |
parent_processing_rule_id
Self foreign key
|
uuidNullable; no default
|
Parent processing rule for nested expression and rule trees. |
Nullable for root rules. If present, references qti.processing_rule(processing_rule_id). Cascades on parent delete. Invalid when: Parent is in another artifact_version, creates a cycle, or changes execution semantics. |
Platform gap fill
Relational processing-tree hierarchy. |
References zero or one parent qti.processing_rule. Example: |
rule_scope
|
textRequired; no default
|
Processing scope used for query and execution grouping. |
Must satisfy processing_rule_scope_ck. Invalid when: Outside enum set or used to claim QTI defines this SQL row scope. |
Platform gap fill
Repository classification for persisted processing rows. |
None. Example: |
rule_name
|
textRequired; no default
|
QTI processing rule or expression element/operator name. |
Required text generated from the object graph and bundled XSD model. Invalid when: Not a QTI processing/expression element, renamed for Alpha, or mismatched with component.element_name. |
1EdTech pass-through
QTI processing rule or expression element name. ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
None. Example: |
sequence_number
|
integerRequired; no default
|
Order within the parent processing scope. |
Required integer. Must preserve QTI processing order and be stable across rehydration. Invalid when: Null, order differs from object graph, or ties cause nondeterministic execution. |
Platform gap fill
Execution ordering aid. ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
None. Example: |
operands
|
jsonbRequired; default
'[]'::jsonb |
Generated operand references and literal values for execution. |
Required JSON array. Must preserve variable references, literal values, and expression child references needed by the runtime. Invalid when: Null, non-array JSON, points to undeclared variables, loses numeric precision, or contains unredacted learner identity. |
1EdTech pass-through
Generated QTI operand references and literal values. ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
None. Example: |
source_trace
|
jsonbRequired; default
'{}'::jsonb |
Generated trace to XSD and spec section for this processing rule. |
Required JSON object and reproducible from the source bundle. Invalid when: Null, non-object JSON, or not tied to the rule_name/component. |
1EdTech pass-through
Generated trace to XSD and spec section. ITD-001 Offline 1EdTech Source Bundle, ITD-007 Provenance Labels |
None. Example: |
qti.delivery_session
Candidate delivery snapshot against one immutable root artifact version.
Purpose
Freezes exactly what one pseudonymous candidate was shown by storing root artifact version, delivery JSON snapshot, lifecycle state, and runtime session state. This protects historical learner experience from later content edits.
Lifecycle
Created by startDeliverySession. Moves through created, active, suspended, submitted, review, closed, or voided. Candidate-scoped deletion removes sessions and cascading attempts while leaving reusable content intact.
Trace
ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy, ITD-019 Security Boundary
QTI defines content and processing, not platform delivery session storage or learner privacy policy.
Relationships
- Belongs to one qti.tenant.
- Pins one qti.artifact_version as root_artifact_version_id.
- Parent of qti.attempt.
Integrity rules
- candidate_ref must be opaque tenant-scoped pseudonymous UUID string.
- status must satisfy delivery_session_status_ck.
- delivery_json_snapshot is required and immutable for historical stability.
Invalid examples
- candidate_ref contains a name, email, SIS ID, raw JWT subject, or access token.
- delivery_json_snapshot does not match root_artifact_version_id projection at session start.
- status outside enum set.
Example row
{
"delivery_session_id": "e0b41369-3019-42a5-a419-d5da6e33904f",
"tenant_id": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
"candidate_ref": "9c41d14e-d011-4517-927e-b9bf0b7d5df4",
"root_artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"status": "active",
"delivery_json_snapshot": {
"kind": "item",
"identifier": "RESPONSE-001"
},
"session_state": {
"navigation": "item"
},
"created_at": "2026-05-20T13:15:00Z",
"updated_at": "2026-05-20T13:16:10Z"
}
Common queries
select delivery_session_id, status from qti.delivery_session where tenant_id = $1 and candidate_ref = $2 order by updated_at desc;delete from qti.delivery_session where tenant_id = $1 and candidate_ref = $2;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
delivery_session_id
Primary key
|
uuidRequired; no default
|
Stable session identifier exposed by delivery APIs. |
Valid UUID and unique primary key. Invalid when: Not a UUID, reused, or guessable outside API authorization. |
Platform gap fill
Platform delivery session identity. |
None. Example: |
tenant_id
Foreign key
|
uuidRequired; no default
|
Tenant boundary for the delivery session. |
Must reference qti.tenant(tenant_id). Invalid when: Does not match authenticated tenant claim or root artifact tenant. |
Platform gap fill
Tenant-scoped learner runtime boundary. |
Belongs to exactly one qti.tenant. Example: |
candidate_ref
|
textRequired; no default
|
Opaque tenant-scoped pseudonymous UUID string for the candidate. |
Required text. Must be pseudonymous; direct names, emails, phone numbers, SIS IDs, raw JWT subjects, access tokens, and contact details are rejected. Invalid when: Contains direct learner or parent PII, raw JWT subject, auth token, SIS ID, or is not tenant-scoped. |
Platform gap fill
Platform learner privacy boundary. QTI_CONTEXT candidateIdentifier uses this value only when runtime context needs it. ITD-024 Candidate And Learner Data Privacy, ITD-019 Security Boundary |
Indexed with tenant_id for candidate session history and deletion. Example: |
root_artifact_version_id
Foreign key
|
uuidRequired; no default
|
Immutable item, test, or section version delivered in this session. |
Must reference qti.artifact_version(artifact_version_id). Invalid when: Missing version, version not owned by tenant, or changed after session start. |
Platform gap fill
Session pins immutable content version. ITD-015 Delivery Session Snapshots, ITD-011 Artifact Versioning |
Belongs to exactly one qti.artifact_version. Example: |
status
|
textRequired; default
'created' |
Session lifecycle state. |
Must satisfy delivery_session_status_ck. Invalid when: Outside enum set or inconsistent with attempts, submitted_at, or review workflow. |
Platform gap fill
Platform delivery lifecycle. |
None. Example: |
delivery_json_snapshot
|
jsonbRequired; no default
|
Snapshot of delivery_json at session start. |
Required JSON object. Must remain stable for the session even if the artifact later receives a new version. Invalid when: Null, mismatched to root_artifact_version_id at start, mutated after attempts, or contains authoring-only trace without declared lossiness. |
Platform gap fill
Generated delivery projection snapshot for historical stability. ITD-006 JSON Projection Boundaries, ITD-015 Delivery Session Snapshots |
None. Example: |
session_state
|
jsonbRequired; default
'{}'::jsonb |
Runtime state not modeled as QTI variables, such as navigation, item sequencing, resume information, or review flags. |
Required JSON object. Treat as learner-runtime data. Do not store direct PII, raw PNP records, tokens, IP addresses, or user agents. Invalid when: Null, non-object JSON, auth headers, raw PNP records, direct learner identity, or state that contradicts delivery_json_snapshot. |
Platform gap fill
Platform runtime state outside QTI variable declarations. ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
created_at
|
timestamptzRequired; default
now() |
Session creation timestamp. |
Required timestamp with time zone. Invalid when: Null or later than updated_at. |
Platform gap fill
Runtime audit metadata. |
None. Example: |
updated_at
|
timestamptzRequired; default
now() |
Last session state mutation timestamp. |
Required timestamp with time zone. Must be updated when status or session_state changes. Invalid when: Null, earlier than created_at, or stale after status/session_state update. |
Platform gap fill
Runtime audit metadata. |
None. Example: |
qti.attempt
Candidate response, template, outcome, and processing trace snapshot inside a delivery session.
Purpose
Stores the learner's QTI variable state and the deterministic processing trace needed to explain scoring and feedback for one item/test artifact version within a session. It is the learner-runtime record that turns QTI content into reportable outcomes.
Lifecycle
Created when a candidate starts or submits an attempt. Moves through active, suspended, submitted, reviewed, or voided. Deleted through candidate-scoped runtime deletion by cascading from delivery_session.
Trace
ITD-016 Attempt State And Processing Trace, ITD-021 Runtime Execution Profile, ITD-024 Candidate And Learner Data Privacy
Response, template, and outcome state preserve QTI variable values. Attempt identity, lifecycle, trace shape, timestamps, redaction, retention, and deletion are platform gap fills.
Relationships
- Belongs to one qti.delivery_session.
- References the qti.artifact_version attempted.
Integrity rules
- Unique (delivery_session_id, artifact_version_id, attempt_number).
- status must satisfy attempt_status_ck.
- processing_trace must be privacy-redacted.
Invalid examples
- processing_trace includes JWTs, IP addresses, user agents, raw PNP records, or direct learner identity.
- attempt_number duplicates within one session/artifact version.
- outcome_state cannot be reproduced by the trace and runtime profile.
Example row
{
"attempt_id": "69e74a21-1190-492f-9f64-7557754d6eef",
"delivery_session_id": "e0b41369-3019-42a5-a419-d5da6e33904f",
"artifact_version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
"attempt_number": 1,
"status": "submitted",
"response_state": {
"RESPONSE": "choiceA"
},
"template_state": {},
"outcome_state": {
"SCORE": 1,
"completionStatus": "completed"
},
"processing_trace": [
{
"rule": "qti-map-response",
"variable": "RESPONSE"
}
],
"started_at": "2026-05-20T13:16:20Z",
"submitted_at": "2026-05-20T13:18:02Z"
}
Common queries
select attempt_number, status, outcome_state from qti.attempt where delivery_session_id = $1 order by attempt_number;select processing_trace from qti.attempt where attempt_id = $1;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
attempt_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one attempt record. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform attempt identity. |
None. Example: |
delivery_session_id
Foreign key
|
uuidRequired; no default
|
Owning delivery session. |
Must reference qti.delivery_session(delivery_session_id). Cascades on session delete. Invalid when: Missing session or tenant mismatch through session. |
Platform gap fill
Attempt belongs to learner runtime session. ITD-015 Delivery Session Snapshots, ITD-016 Attempt State And Processing Trace |
Belongs to exactly one qti.delivery_session. Example: |
artifact_version_id
Foreign key
|
uuidRequired; no default
|
Immutable item/test artifact version attempted. |
Must reference qti.artifact_version(artifact_version_id). Invalid when: Does not belong to the delivery session snapshot or changes after processing. |
Platform gap fill
Attempt pins content version for reproducible processing. ITD-011 Artifact Versioning, ITD-016 Attempt State And Processing Trace |
Belongs to exactly one qti.artifact_version. Example: |
attempt_number
Unique with delivery_session_id and artifact_version_id
|
integerRequired; no default
|
Attempt count within a session and artifact version. |
Required integer and unique with delivery_session_id plus artifact_version_id. Should increase for repeated attempts. Invalid when: Zero or negative by convention, duplicated, or reused after an adaptive attempt changes state. |
Platform gap fill
Platform attempt sequencing. |
None. Example: |
status
|
textRequired; default
'active' |
Attempt lifecycle state. |
Must satisfy attempt_status_ck. Invalid when: Outside enum set or inconsistent with suspended_at/submitted_at. |
Platform gap fill
Platform attempt lifecycle. |
None. Example: |
response_state
|
jsonbRequired; default
'{}'::jsonb |
Candidate response variables at the last processing point. |
Required JSON object. Keys should be QTI response variable identifiers; values must match declaration cardinality/base_type. Treat as learner data. Invalid when: Null, values inconsistent with qti.variable_declaration, unnecessary learner PII copied from outside the response, or logged without redaction. |
1EdTech pass-through
QTI response variable state bound to learner runtime. ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
template_state
|
jsonbRequired; default
'{}'::jsonb |
Template variables used for item cloning and stability. |
Required JSON object. Keys should be QTI template variable identifiers; values must match declarations. Invalid when: Null, regenerated on read instead of persisted, inconsistent with template processing trace, or logged with learner identity. |
1EdTech pass-through
QTI template variable state bound to session stability. ITD-016 Attempt State And Processing Trace, ITD-021 Runtime Execution Profile, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
outcome_state
|
jsonbRequired; default
'{}'::jsonb |
Outcome variables after template, response, and outcome processing. |
Required JSON object. Keys should be QTI outcome variable identifiers; values must match declarations and processing results. Invalid when: Null, cannot be reproduced by processing rules under the runtime profile, or includes unsupported outcomes without diagnostics. |
1EdTech pass-through
QTI outcome variable state. ITD-016 Attempt State And Processing Trace, ITD-021 Runtime Execution Profile, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
processing_trace
|
jsonbRequired; default
'[]'::jsonb |
Deterministic trace of template, response, and outcome processing operations. |
Required JSON array. May include rule names, variable identifiers, before/after values, and diagnostics. Must exclude JWTs, headers, access tokens, IP addresses, user agents, raw PNP records, raw package bytes, and direct learner identity fields. Invalid when: Null, non-array JSON, nondeterministic, lacks failed-closed diagnostics for unsupported operators, or contains auth/PII data. |
Platform gap fill
Implementation trace of QTI processing execution; QTI defines processing semantics, not this stored audit trail. ITD-016 Attempt State And Processing Trace, ITD-021 Runtime Execution Profile, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
started_at
|
timestamptzRequired; default
now() |
Attempt start timestamp. |
Required timestamp with time zone. Invalid when: Null or after submitted_at. |
Platform gap fill
Runtime audit metadata. |
None. Example: |
suspended_at
|
timestamptzNullable; no default
|
Attempt suspension timestamp, if the attempt was suspended. |
Nullable timestamp with time zone. Should be set when status is suspended. Invalid when: Set while status never suspended without lifecycle evidence, before started_at, or after submitted_at. |
Platform gap fill
Runtime lifecycle audit metadata. |
None. Example: |
submitted_at
|
timestamptzNullable; no default
|
Attempt submission timestamp, if the attempt was submitted. |
Nullable timestamp with time zone. Should be set when status is submitted or reviewed. Invalid when: Before started_at, set while status remains active without evidence, or absent for submitted/reviewed attempts. |
Platform gap fill
Runtime lifecycle audit metadata. |
None. Example: |
qti.conformance_run
Release evidence for a QTI conformance/profile run.
Purpose
Persists repeatable proof that a runner exercised the source bundle, examples, XML/object/relational/JSON round trips, processing coverage, and profile expectations. The run row summarizes the evidence; assertion rows contain details.
Lifecycle
Created when the conformance runner starts. Moves from running to passed, failed, or error. Retained as release evidence.
Trace
QTI defines conformance expectations and examples, not a platform table for release-gate evidence.
Relationships
- Parent of qti.conformance_assertion.
Integrity rules
- status must satisfy conformance_run_status_ck.
- bundle_hash must identify the offline source bundle used by the run.
Invalid examples
- Run claims passed while child assertions failed.
- bundle_hash omitted or points to live network state.
- summary includes secrets or learner-runtime data.
Example row
{
"conformance_run_id": "ed0065af-721c-4799-a48c-8ce0c5fdc7f2",
"profile": "qti-3.0",
"bundle_hash": "sha256:184e568a31e239c0b282e7e1926dd7e8756901826f4a91e9e5b1ad58369d9ef4",
"runner_version": "qti-conformance-runner/2026-05-20",
"started_at": "2026-05-20T14:00:00Z",
"finished_at": "2026-05-20T14:04:30Z",
"status": "passed",
"summary": {
"examples": 327,
"assertions": 28292
}
}
Common queries
select conformance_run_id, status, summary from qti.conformance_run where profile = 'qti-3.0' order by started_at desc limit 5;select status, count(*) from qti.conformance_assertion where conformance_run_id = $1 group by status;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
conformance_run_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one conformance run. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform evidence row identity. |
None. Example: |
profile
|
textRequired; no default
|
Targeted QTI 3.0 conformance profile or optional feature set. |
Required text. Must be a profile the runner understands. Invalid when: Unsupported profile, Alpha-only label, or profile not represented by assertions. |
Platform gap fill
Platform conformance profile label tied to the QTI bundle. ITD-017 Conformance Evidence, ITD-001 Offline 1EdTech Source Bundle |
None. Example: |
bundle_hash
|
textRequired; no default
|
Hash of the offline spec bundle used by the run. |
Required text with algorithm prefix and digest. Invalid when: Missing, live network URL, or not reproducible from the bundle used. |
Platform gap fill
Release evidence ties to immutable local source bundle. ITD-001 Offline 1EdTech Source Bundle, ITD-017 Conformance Evidence |
None. Example: |
runner_version
|
textRequired; no default
|
Version or identity of the conformance runner. |
Required text. Must be specific enough to reproduce behavior. Invalid when: Blank, vague, or points to unpinned code. |
Platform gap fill
Release evidence metadata. |
None. Example: |
started_at
|
timestamptzRequired; default
now() |
Run start timestamp. |
Required timestamp with time zone. Invalid when: Null or after finished_at. |
Platform gap fill
Conformance audit metadata. |
None. Example: |
finished_at
|
timestamptzNullable; no default
|
Run finish timestamp, if complete. |
Nullable timestamp with time zone. Should be set for passed, failed, or error. Invalid when: Before started_at, absent for completed terminal status without explanation, or set while still running. |
Platform gap fill
Conformance lifecycle audit metadata. |
None. Example: |
status
|
textRequired; default
'running' |
Run lifecycle status. |
Must satisfy conformance_run_status_ck. Invalid when: Outside enum set or inconsistent with child assertion statuses. |
Platform gap fill
Release evidence lifecycle. |
None. Example: |
summary
|
jsonbRequired; default
'{}'::jsonb |
Generated coverage and pass/fail summary. |
Required JSON object. Should include counts, profile facts, and links/keys to assertion evidence; must not include secrets or learner-runtime data. Invalid when: Null, non-object JSON, contradicts assertion rows, or includes raw package bytes/secrets. |
Platform gap fill
Generated release-gate summary. |
None. Example: |
qti.conformance_assertion
Per-example and per-feature conformance evidence.
Purpose
Stores individual assertion results from conformance, round-trip, validation, processing, and coverage checks. This lets releases and future AI agents identify exactly which example, spec reference, or feature passed or failed.
Lifecycle
Created as child rows during a conformance run. Deleted when the parent run is deleted.
Trace
Assertion row identity, generated status, and diagnostics are gap fills. artifact_ref and spec_ref can be pass-through references to QTI examples, schemas, or spec anchors.
Relationships
- Belongs to one qti.conformance_run.
Integrity rules
- Unique (conformance_run_id, assertion_key).
- status must satisfy conformance_assertion_status_ck.
- details must carry enough diagnostics for failed/error assertions.
Invalid examples
- Duplicate assertion_key in one run.
- failed assertion with empty details.
- spec_ref points to a live-only reference that cannot be reproduced from the bundle.
Example row
{
"conformance_assertion_id": "40bdfcf0-b97b-4a38-b308-a5d271a75943",
"conformance_run_id": "ed0065af-721c-4799-a48c-8ce0c5fdc7f2",
"assertion_key": "roundtrip:items/response-001.xml",
"artifact_ref": "examples/qtiv3-examples/items/response-001.xml",
"spec_ref": "imsqti_itemv3p0p1_v1p0.xsd#qti-assessment-item",
"status": "passed",
"details": {
"canonicalHashMatched": true
}
}
Common queries
select assertion_key, artifact_ref, spec_ref, details from qti.conformance_assertion where conformance_run_id = $1 and status in ('failed','error');select status, count(*) from qti.conformance_assertion where conformance_run_id = $1 group by status;
Fields
| Field | Type | Meaning | Range, constraints, invalid values | Provenance and ITD | Relationship and example |
|---|---|---|---|---|---|
conformance_assertion_id
Primary key
|
uuidRequired; no default
|
Stable identifier for one assertion result. |
Valid UUID and unique primary key. Invalid when: Not a UUID or reused. |
Platform gap fill
Platform assertion row identity. |
None. Example: |
conformance_run_id
Foreign key
|
uuidRequired; no default
|
Owning conformance run. |
Must reference qti.conformance_run(conformance_run_id). Cascades on run delete. Invalid when: Missing parent run or status contradicts parent run summary. |
Platform gap fill
Assertion belongs to release evidence run. |
Belongs to exactly one qti.conformance_run. Example: |
assertion_key
Unique with conformance_run_id
|
textRequired; no default
|
Stable key generated by the conformance runner for this assertion. |
Required text and unique within the run. Must be deterministic for the same assertion. Invalid when: Duplicated in a run, nondeterministic across reruns, or so vague it cannot locate the assertion. |
Platform gap fill
Generated assertion identity. |
None. Example: |
artifact_ref
|
textNullable; no default
|
Example, fixture, or artifact path covered by this assertion. |
Nullable when assertion is feature-level only. If present, should point to a bundled example, generated artifact, or artifact identifier. Invalid when: Live-only URL, missing fixture, or reference to learner-runtime data. |
1EdTech pass-through
QTI example or artifact reference covered by conformance evidence. ITD-001 Offline 1EdTech Source Bundle, ITD-017 Conformance Evidence |
None. Example: |
spec_ref
|
textNullable; no default
|
Spec section, schema component, or generated trace reference covered by this assertion. |
Nullable when the assertion is implementation-only. If present, must be reproducible from the bundled source or generated traceability. Invalid when: Points only to live network docs, wrong schema file, or cannot be followed by a future generator. |
1EdTech pass-through
1EdTech spec, schema, or generated traceability reference. ITD-001 Offline 1EdTech Source Bundle, ITD-007 Provenance Labels, ITD-017 Conformance Evidence |
None. Example: |
status
|
textRequired; no default
|
Assertion result status. |
Must satisfy conformance_assertion_status_ck. Invalid when: Outside enum set, contradicts details, or failed/error without diagnostics. |
Platform gap fill
Generated assertion result lifecycle. |
None. Example: |
details
|
jsonbRequired; default
'{}'::jsonb |
Assertion diagnostics, canonical hashes, processing outcomes, and failure details. |
Required JSON object. Failed or error assertions must explain enough for reproduction. Must not include secrets, raw JWTs, direct learner PII, or unrelated package bytes. Invalid when: Null, non-object JSON, missing diagnostics for failure, or contains auth/PII data. |
Platform gap fill
Generated release-gate diagnostics; QTI defines conformance expectations, not this evidence payload. ITD-017 Conformance Evidence, ITD-024 Candidate And Learner Data Privacy |
None. Example: |
Allowed Values
Every constrained value set includes behavioral meaning, provenance, and the architecture decision that authorizes it.
Package import status
Package lifecycle values are defined by the platform ingest workflow. QTI defines package content, not import job state. ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
importing |
The package row has been created and validation or resource extraction is still in progress. Do not deliver artifacts from this package yet. | Used outside qti.content_package.import_status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes |
imported |
Validation, resource extraction, artifact creation, and version projection succeeded. The package can be queried, delivered, and exported. | Used outside qti.content_package.import_status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes |
rejected |
Validation, package-closure checks, XSD/Schematron validation, or privacy validation failed. Keep diagnostics in metadata; do not create deliverable sessions from this package. | Used outside qti.content_package.import_status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes |
superseded |
A later package or version replaces this import for operational use while preserving this row for audit and reproducibility. | Used outside qti.content_package.import_status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-009 Package Resource And File Ingest, ITD-010 Idempotency And Hashes |
IMS/QTI package resource type
Resource type strings are copied from IMS/QTI content-package manifests and the bundled QTI ASI XML Binding package vocabulary. ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
imsqti_test_xmlv3p0 |
A QTI assessment test XML resource. The primary href should point to a test XML document. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_section_xmlv3p0 |
A QTI assessment section XML resource. Use for sections managed independently from a test. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_item_xmlv3p0 |
A QTI assessment item XML resource. Use for a candidate-facing item with interactions and response processing. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_resprocessing_xmlv3p0 |
A QTI response-processing XML resource when response processing is represented as a separate package resource. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_outcomes_xmlv3p0 |
A QTI outcome-declaration XML resource, often used when outcomes are managed independently. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_stimulus_xmlv3p0 |
A QTI assessment stimulus XML resource that items can depend on for shared passage or stimulus content. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_fragment_xmlv3p0 |
A managed QTI fragment resource used by item, section, or test content. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsqti_rptemplate_xmlv3p0 |
A response-processing template XML resource, including standard or custom templates packaged with items. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
associatedcontent/learning-application-resource |
A learning-application asset referenced by QTI content. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
webcontent |
Generic web content asset, such as image, video, audio, HTML, or other supporting media. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
imsbasiclti_xmlv1p3 |
An LTI tool resource referenced by packaged content. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
controlfile |
A manifest control file or package control artifact. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
resourcemetadata/xml |
Metadata XML associated with a package resource. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
resourceextmetadata/xml |
External metadata XML associated with a package resource. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
qtiusagedata/xml |
A QTI usage-data XML resource carrying item or distractor statistics. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
pls |
Pronunciation lexicon resource used by speech or accessibility presentation. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
css2 |
CSS 2 stylesheet resource. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
css3 |
CSS 3 stylesheet resource. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
extension |
An extension resource. Preserve and export it, but do not treat it as a known QTI root without validation evidence. | Used outside qti.package_resource.resource_type, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels |
Artifact kind
Repository categories are derived from QTI root elements and package resources so APIs can route artifacts without renaming QTI concepts. ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
item |
Logical artifact whose root is a QTI assessment item. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
test |
Logical artifact whose root is a QTI assessment test. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
section |
Logical artifact whose root is a QTI assessment section. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
stimulus |
Logical artifact whose root is a QTI assessment stimulus. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
outcome-declaration |
Logical artifact whose root is a standalone QTI outcome declaration. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
response-processing |
Logical artifact whose root is standalone QTI response processing or a response-processing template. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
result |
Logical artifact whose root is a QTI assessment result report. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
usage-data |
Logical artifact whose root is QTI usage data. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
metadata |
Logical artifact for QTI or resource metadata XML. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
manifest-resource |
Manifest-only resource that must remain addressable even when it is not a QTI root document. | Used outside qti.artifact.artifact_kind, misspelled, or used contrary to this behavior. | Platform gap fill ITD-011 Artifact Versioning, ITD-012 Artifact Kind Allowed Values |
Variable declaration kind
Values mirror QTI variable declaration categories: response, outcome, template, and context. ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
response |
Candidate response variable declared by QTI and usually bound to an interaction. | Used outside qti.variable_declaration.variable_kind, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels |
outcome |
Scoring, feedback, or reporting variable set by default values or processing rules. | Used outside qti.variable_declaration.variable_kind, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels |
template |
Template variable used to instantiate or clone a parameterized item. | Used outside qti.variable_declaration.variable_kind, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels |
context |
Contextual variable available to template or response processing, including candidate, test, or system context when declared. | Used outside qti.variable_declaration.variable_kind, misspelled, or used contrary to this behavior. | 1EdTech pass-through ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels |
Processing rule scope
The row scope is a repository classification for query and execution order; QTI defines the processing elements and expressions themselves. ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
response |
Rule belongs to response processing and computes outcome variables from candidate responses. | Used outside qti.processing_rule.rule_scope, misspelled, or used contrary to this behavior. | Platform gap fill ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
outcome |
Rule belongs to outcome processing at test or section level. | Used outside qti.processing_rule.rule_scope, misspelled, or used contrary to this behavior. | Platform gap fill ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
template |
Rule belongs to template processing and initializes template state before delivery. | Used outside qti.processing_rule.rule_scope, misspelled, or used contrary to this behavior. | Platform gap fill ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
expression |
Row represents an expression subtree or operator nested inside response, outcome, or template processing. | Used outside qti.processing_rule.rule_scope, misspelled, or used contrary to this behavior. | Platform gap fill ITD-014 Processing Rule Projection, ITD-021 Runtime Execution Profile |
Delivery session status
Delivery lifecycle states are platform persistence behavior. QTI defines item/test content and processing, not this session state machine. ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
created |
Session exists and has a delivery JSON snapshot but has not yet become the active learner experience. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
active |
Candidate may interact with delivered content and create or update attempts. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
suspended |
Candidate work is paused and may be resumed with the same snapshot and session state. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
submitted |
Candidate has submitted the session; scoring and attempt records are complete enough for review. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
review |
Session is in review mode. Content and responses may be displayed, but interactions must not change response variables. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
closed |
Session is final for normal operations. Future edits to content do not affect it. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
voided |
Session is retained as an operational record but should not count toward reporting or outcomes. | Used outside qti.delivery_session.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-015 Delivery Session Snapshots, ITD-024 Candidate And Learner Data Privacy |
Attempt status
Attempt lifecycle states are platform persistence behavior around QTI response processing. ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
active |
Candidate can still modify responses for this attempt. | Used outside qti.attempt.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
suspended |
Candidate response state is saved for later continuation. | Used outside qti.attempt.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
submitted |
Candidate submitted responses and processing has produced outcome state. | Used outside qti.attempt.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
reviewed |
Attempt has been reviewed by an authorized person or workflow. | Used outside qti.attempt.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
voided |
Attempt is retained for audit but excluded from reporting and outcomes. | Used outside qti.attempt.status, misspelled, or used contrary to this behavior. | Platform gap fill ITD-016 Attempt State And Processing Trace, ITD-024 Candidate And Learner Data Privacy |
Conformance run status
Release-evidence lifecycle values are platform gap fills. ITD-017 Conformance Evidence.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
running |
The conformance runner has started and assertions are not yet complete. | Used outside qti.conformance_run.status, misspelled, or used contrary to this behavior. | Platform gap fill |
passed |
All required assertions for the targeted profile passed. | Used outside qti.conformance_run.status, misspelled, or used contrary to this behavior. | Platform gap fill |
failed |
At least one required assertion failed. | Used outside qti.conformance_run.status, misspelled, or used contrary to this behavior. | Platform gap fill |
error |
The runner could not complete because of tool, environment, or infrastructure failure. | Used outside qti.conformance_run.status, misspelled, or used contrary to this behavior. | Platform gap fill |
Conformance assertion status
Per-assertion lifecycle values are generated evidence about implementation behavior, not QTI content. ITD-017 Conformance Evidence.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
passed |
This assertion met the expected result. | Used outside qti.conformance_assertion.status, misspelled, or used contrary to this behavior. | Platform gap fill |
failed |
This assertion ran and found behavior that violates the target profile or platform contract. | Used outside qti.conformance_assertion.status, misspelled, or used contrary to this behavior. | Platform gap fill |
skipped |
This assertion was intentionally not run, usually because it is out of profile or unavailable in the current runner. | Used outside qti.conformance_assertion.status, misspelled, or used contrary to this behavior. | Platform gap fill |
error |
This assertion could not produce a valid pass/fail result because the runner or fixture failed. | Used outside qti.conformance_assertion.status, misspelled, or used contrary to this behavior. | Platform gap fill |
JSON projection lossiness
The platform names JSON projection lossiness because QTI defines XML, not public JSON projection envelopes. ITD-006 JSON Projection Boundaries, ITD-018 API Boundary.
| Value | Behavior | Invalid when | Provenance and ITD |
|---|---|---|---|
none |
The projection must preserve all spec-defined fields needed to reconstruct the generated object graph and canonical XML. | Used outside API projection metadata, misspelled, or used contrary to this behavior. | Platform gap fill |
declared |
The projection may omit only explicitly documented authoring-only or diagnostic detail, such as source trace or mixed-content tail detail. | Used outside API projection metadata, misspelled, or used contrary to this behavior. | Platform gap fill |