TimeBack Platform - QTI 1EdTech

Data dictionary for the shared QTI persistence schema

This dictionary documents every QTI 1EdTech persistence table, field, allowed value, provenance label, range, nullability rule, relationship, invalid-value test, and architecture decision link. It is written for a staff engineer who needs to write migrations and queries without reading source code.

Tables13
Fields127
Allowed value sets10
ArchitectureApproved
Reading rule. Each row is labeled either 1EdTech pass-through, Platform gap fill, or Gap fill row with 1EdTech pass-through values. Pass-through values come from QTI XML, IMS manifests, bundled XSDs, VDEX vocabularies, Schematron assertions, or generated traceability. Gap fills are platform persistence decisions and link back to an architecture ITD.
Schema navigation

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.
Table

qti.tenant

Platform isolation root for schools, districts, publishers, or applications using the QTI surface.

Platform gap fill Primary key tenant_id

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
uuid
Required; 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.

ITD-008 Tenant Boundary

None.

Example: 0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3

tenant_key Unique
text
Required; 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.

ITD-008 Tenant Boundary

None.

Example: north-valley

display_name
text
Required; 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.

ITD-008 Tenant Boundary

None.

Example: North Valley School District

created_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T12:30:00Z

Table

qti.content_package

One imported IMS Content Package or loose XML bundle, scoped to a tenant.

Gap fill row with 1EdTech pass-through values Primary key package_id

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
uuid
Required; 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.

ITD-009 Package Resource And File Ingest

None.

Example: 7f2e4dd2-c147-49ea-af77-41a6fdd70980

tenant_id Foreign key
uuid
Required; 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: 0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3

source_uri
text
Nullable; 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.

ITD-009 Package Resource And File Ingest

None.

Example: publisher/grade-6-math/qti.zip

idempotency_key Unique with tenant_id when non-null
text
Nullable; 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.

ITD-010 Idempotency And Hashes, ITD-018 API Boundary

None.

Example: pkg-upload-2026-05-20-001

package_hash Unique with tenant_id
text
Required; 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.

ITD-010 Idempotency And Hashes

None.

Example: sha256:6a8c1f58c16f4b0b4f0a0d8c6be8d226e3d5d80f0b2f7d2f49e6d7d9e9d4f1cb

manifest_identifier
text
Nullable; 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: MANIFEST-G6-MATH-2026

qti_profile
text
Required; 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: qti-3.0

import_status
text
Required; 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.

Allowed values: Package import status

Platform gap fill

Platform package import lifecycle.

ITD-009 Package Resource And File Ingest

None.

Example: imported

metadata
jsonb
Required; 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: {"resourceCount":18,"fileCount":42}

imported_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:00:00Z

Table

qti.package_resource

IMS manifest resource row with resource identifiers, type, href, dependencies, and metadata.

Gap fill row with 1EdTech pass-through values Primary key resource_id

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
uuid
Required; 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.

ITD-009 Package Resource And File Ingest

None.

Example: aafcefe4-9814-4d43-93be-556dc38dace0

package_id Foreign key
uuid
Required; 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.

ITD-009 Package Resource And File Ingest

Belongs to exactly one qti.content_package.

Example: 7f2e4dd2-c147-49ea-af77-41a6fdd70980

resource_identifier Unique with package_id
text
Required; 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: item-RESPONSE-001

resource_type
text
Required; 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.

Allowed values: IMS/QTI package resource type

1EdTech pass-through

IMS/QTI package resource type value.

ITD-009 Package Resource And File Ingest, ITD-007 Provenance Labels

None.

Example: imsqti_item_xmlv3p0

href
text
Nullable; 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: items/response-001.xml

dependencies
jsonb
Required; 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: ["stimulus-READING-PASSAGE-1"]

metadata
jsonb
Required; 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: {"files":["items/response-001.xml","media/chart.png"]}

Table

qti.package_file

Original file bytes from an imported IMS/QTI package.

Gap fill row with 1EdTech pass-through values Primary key package_file_id

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
uuid
Required; 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.

ITD-009 Package Resource And File Ingest

None.

Example: 30225f0a-949d-49d5-a7fc-e2ea43863e96

package_id Foreign key
uuid
Required; 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.

ITD-009 Package Resource And File Ingest

Belongs to exactly one qti.content_package.

Example: 7f2e4dd2-c147-49ea-af77-41a6fdd70980

resource_id Foreign key
uuid
Nullable; 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.

ITD-009 Package Resource And File Ingest

Belongs to zero or one qti.package_resource.

Example: aafcefe4-9814-4d43-93be-556dc38dace0

package_path Unique with package_id
text
Required; 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: items/response-001.xml

media_type
text
Required; 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.

ITD-009 Package Resource And File Ingest

None.

Example: application/xml

byte_length
integer
Required; 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.

ITD-009 Package Resource And File Ingest

None.

Example: 18422

content_hash
text
Required; 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.

ITD-010 Idempotency And Hashes

None.

Example: sha256:92fb3e7a6e6d1df0e5759bda79b9c5a0459dfb7ccf2e0b9eb81227759df8c371

content_bytes
bytea
Required; 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: <binary XML or media bytes>

metadata
jsonb
Required; 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: {"listedInManifest":true,"role":"primary-qti-xml"}

created_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:00:01Z

Table

qti.artifact

Stable logical QTI document or package artifact across immutable versions.

Gap fill row with 1EdTech pass-through values Primary key artifact_id

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
uuid
Required; 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.

ITD-011 Artifact Versioning

None.

Example: 58612cab-9c46-426c-8c20-0e9f19c807c5

tenant_id Foreign key
uuid
Required; 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.

ITD-008 Tenant Boundary, ITD-011 Artifact Versioning

Belongs to exactly one qti.tenant.

Example: 0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3

package_id Foreign key
uuid
Nullable; 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: 7f2e4dd2-c147-49ea-af77-41a6fdd70980

resource_id Foreign key
uuid
Nullable; 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: aafcefe4-9814-4d43-93be-556dc38dace0

artifact_kind
text
Required; 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.

Allowed values: Artifact kind

Platform gap fill

Gap-fill classification derived from QTI roots.

ITD-012 Artifact Kind Allowed Values

None.

Example: item

qti_identifier
text
Nullable; 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: RESPONSE-001

title
text
Nullable; 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: Linear equations checkpoint

language
text
Nullable; 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.

ITD-004 XML Authority And Canonical Hashes

None.

Example: en-US

latest_version_id Convenience pointer
uuid
Nullable; 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.

ITD-011 Artifact Versioning

Points to zero or one qti.artifact_version for the same artifact.

Example: efcf3561-3a66-4825-9588-e792ef20c312

created_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:00:02Z

Table

qti.artifact_version

Immutable XML, generated object graph, projections, and trace for one saved artifact edition.

Gap fill row with 1EdTech pass-through values Primary key artifact_version_id

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
uuid
Required; 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.

ITD-011 Artifact Versioning

None.

Example: efcf3561-3a66-4825-9588-e792ef20c312

artifact_id Foreign key
uuid
Required; 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.

ITD-011 Artifact Versioning

Belongs to exactly one qti.artifact.

Example: 58612cab-9c46-426c-8c20-0e9f19c807c5

version_number Unique with artifact_id
integer
Required; 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.

ITD-011 Artifact Versioning

None.

Example: 1

source_xml
xml
Required; 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: <qti-assessment-item identifier="RESPONSE-001" ...>

canonical_xml
text
Required; 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.

ITD-004 XML Authority And Canonical Hashes

None.

Example: <qti-assessment-item identifier="RESPONSE-001" ...>

xml_hash Unique with artifact_id
text
Required; 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: sha256:e8a86d190e6d8865c4562b8e8b2b1e299f8a8d37a58c0bb71b35ef28bb62ab31

root_element
text
Required; 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: qti-assessment-item

root_type
text
Nullable; 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: AssessmentItemDType

schema_file
text
Required; 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: imsqti_itemv3p0p1_v1p0.xsd

object_graph
jsonb
Required; 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: {"element":"qti-assessment-item","identifier":"RESPONSE-001"}

delivery_json
jsonb
Nullable; 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: {"kind":"item","identifier":"RESPONSE-001","interactions":[...]}

authoring_json
jsonb
Nullable; 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: {"kind":"item","identifier":"RESPONSE-001","sourceTrace":{...}}

spec_trace
jsonb
Required; 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: {"rootElement":"qti-assessment-item","schemaFile":"imsqti_itemv3p0p1_v1p0.xsd"}

supersedes_version_id Foreign key
uuid
Nullable; 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.

ITD-011 Artifact Versioning

References zero or one earlier qti.artifact_version.

Example: a1f6b903-b26f-43ac-93ce-f6626ce3810d

created_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:00:03Z

created_by
text
Nullable; 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: system:package-ingest

Table

qti.component

Lossless relational projection of generated QTI object-graph nodes.

Gap fill row with 1EdTech pass-through values Primary key component_id

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
uuid
Required; 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.

ITD-005 Lossless Relational Projection

None.

Example: c09956ea-d444-42b7-9e36-37f948a8c4f7

artifact_version_id Foreign key
uuid
Required; 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: efcf3561-3a66-4825-9588-e792ef20c312

parent_component_id Self foreign key
uuid
Nullable; 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.

ITD-005 Lossless Relational Projection

References zero or one parent qti.component.

Example: null

ordinal
integer
Required; 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: 0

element_name
text
Required; 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: qti-assessment-item

qualified_name
text
Nullable; 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: {http://www.imsglobal.org/xsd/imsqtiasi_v3p0}qti-assessment-item

namespace_uri
text
Nullable; 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.

ITD-004 XML Authority And Canonical Hashes

None.

Example: http://www.imsglobal.org/xsd/imsqtiasi_v3p0

type_name
text
Nullable; 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: AssessmentItemDType

qti_identifier
text
Nullable; 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: RESPONSE

component_path Unique with artifact_version_id
text
Required; 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.

ITD-005 Lossless Relational Projection

None.

Example: $.itemBody.choiceInteraction[0]

attributes
jsonb
Required; 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: {"identifier":"RESPONSE-001","title":"Linear equations checkpoint"}

text_value
text
Nullable; 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: Solve for x.

tail_value
text
Nullable; 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: after the interaction.

source_trace
jsonb
Required; 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: {"schemaFile":"imsqti_itemv3p0p1_v1p0.xsd","type":"AssessmentItemDType"}

Table

qti.variable_declaration

Typed query projection for QTI response, outcome, template, and context variables.

Gap fill row with 1EdTech pass-through values Primary key variable_declaration_id

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
uuid
Required; 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.

ITD-013 Variable Declaration Projection

None.

Example: 0c6f5271-9d9e-4df1-8d5d-2ad59dacde66

artifact_version_id Foreign key
uuid
Required; 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: efcf3561-3a66-4825-9588-e792ef20c312

component_id Foreign key
uuid
Required; 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: 7293a5f9-55a9-42cb-b8e6-a2be7d166d35

variable_kind
text
Required; no default

QTI variable category.

Must satisfy variable_kind_ck.

Invalid when: Outside enum set or used to invent a platform-only variable category.

Allowed values: Variable declaration kind

1EdTech pass-through

QTI variable declaration category.

ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels

None.

Example: response

identifier Unique with artifact_version_id and variable_kind
text
Required; 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: RESPONSE

cardinality
text
Nullable; 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: single

base_type
text
Nullable; 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: identifier

default_value
jsonb
Nullable; 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: {"values":[0]}

correct_response
jsonb
Nullable; 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: {"values":["choiceA"]}

mapping
jsonb
Nullable; 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: {"defaultValue":0,"mapEntries":[{"mapKey":"choiceA","mappedValue":1}]}

source_trace
jsonb
Required; 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: {"element":"qti-response-declaration","schemaFile":"imsqti_itemv3p0p1_v1p0.xsd"}

Table

qti.processing_rule

Executable QTI processing and expression tree projection.

Gap fill row with 1EdTech pass-through values Primary key processing_rule_id

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
uuid
Required; 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.

ITD-014 Processing Rule Projection

None.

Example: 74b1c279-e85f-407e-971e-16408ad792c0

artifact_version_id Foreign key
uuid
Required; 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: efcf3561-3a66-4825-9588-e792ef20c312

component_id Foreign key
uuid
Required; 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: 913a57f5-98a5-4726-940b-d9610b721ccb

parent_processing_rule_id Self foreign key
uuid
Nullable; 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.

ITD-014 Processing Rule Projection

References zero or one parent qti.processing_rule.

Example: null

rule_scope
text
Required; 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.

Allowed values: Processing rule scope

Platform gap fill

Repository classification for persisted processing rows.

ITD-014 Processing Rule Projection

None.

Example: response

rule_name
text
Required; 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: qti-map-response

sequence_number
integer
Required; 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: 10

operands
jsonb
Required; 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: [{"variableIdentifier":"RESPONSE"}]

source_trace
jsonb
Required; 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: {"element":"qti-map-response","schemaFile":"imsqti_responseprocessingv3p0_v1p0.xsd"}

Table

qti.delivery_session

Candidate delivery snapshot against one immutable root artifact version.

Platform gap fill Primary key delivery_session_id

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
uuid
Required; 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.

ITD-015 Delivery Session Snapshots

None.

Example: e0b41369-3019-42a5-a419-d5da6e33904f

tenant_id Foreign key
uuid
Required; 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.

ITD-008 Tenant Boundary, ITD-015 Delivery Session Snapshots

Belongs to exactly one qti.tenant.

Example: 0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3

candidate_ref
text
Required; 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: 9c41d14e-d011-4517-927e-b9bf0b7d5df4

root_artifact_version_id Foreign key
uuid
Required; 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: efcf3561-3a66-4825-9588-e792ef20c312

status
text
Required; 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.

Allowed values: Delivery session status

Platform gap fill

Platform delivery lifecycle.

ITD-015 Delivery Session Snapshots

None.

Example: active

delivery_json_snapshot
jsonb
Required; 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: {"kind":"item","identifier":"RESPONSE-001"}

session_state
jsonb
Required; 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: {"navigation":"item","currentItem":"RESPONSE-001"}

created_at
timestamptz
Required; default now()

Session creation timestamp.

Required timestamp with time zone.

Invalid when: Null or later than updated_at.

Platform gap fill

Runtime audit metadata.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:15:00Z

updated_at
timestamptz
Required; 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.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:16:10Z

Table

qti.attempt

Candidate response, template, outcome, and processing trace snapshot inside a delivery session.

Gap fill row with 1EdTech pass-through values Primary key attempt_id

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
uuid
Required; 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.

ITD-016 Attempt State And Processing Trace

None.

Example: 69e74a21-1190-492f-9f64-7557754d6eef

delivery_session_id Foreign key
uuid
Required; 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: e0b41369-3019-42a5-a419-d5da6e33904f

artifact_version_id Foreign key
uuid
Required; 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: efcf3561-3a66-4825-9588-e792ef20c312

attempt_number Unique with delivery_session_id and artifact_version_id
integer
Required; 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.

ITD-016 Attempt State And Processing Trace

None.

Example: 1

status
text
Required; default 'active'

Attempt lifecycle state.

Must satisfy attempt_status_ck.

Invalid when: Outside enum set or inconsistent with suspended_at/submitted_at.

Allowed values: Attempt status

Platform gap fill

Platform attempt lifecycle.

ITD-016 Attempt State And Processing Trace

None.

Example: submitted

response_state
jsonb
Required; 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: {"RESPONSE":"choiceA"}

template_state
jsonb
Required; 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: {"A":3,"B":5}

outcome_state
jsonb
Required; 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: {"SCORE":1,"completionStatus":"completed"}

processing_trace
jsonb
Required; 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: [{"rule":"qti-map-response","variable":"RESPONSE","result":1}]

started_at
timestamptz
Required; default now()

Attempt start timestamp.

Required timestamp with time zone.

Invalid when: Null or after submitted_at.

Platform gap fill

Runtime audit metadata.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T13:16:20Z

suspended_at
timestamptz
Nullable; 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.

ITD-016 Attempt State And Processing Trace

None.

Example: 2026-05-20T13:17:00Z

submitted_at
timestamptz
Nullable; 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.

ITD-016 Attempt State And Processing Trace

None.

Example: 2026-05-20T13:18:02Z

Table

qti.conformance_run

Release evidence for a QTI conformance/profile run.

Platform gap fill Primary key conformance_run_id

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

ITD-017 Conformance Evidence

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
uuid
Required; 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.

ITD-017 Conformance Evidence

None.

Example: ed0065af-721c-4799-a48c-8ce0c5fdc7f2

profile
text
Required; 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: qti-3.0

bundle_hash
text
Required; 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: sha256:184e568a31e239c0b282e7e1926dd7e8756901826f4a91e9e5b1ad58369d9ef4

runner_version
text
Required; 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.

ITD-017 Conformance Evidence

None.

Example: qti-conformance-runner/2026-05-20

started_at
timestamptz
Required; default now()

Run start timestamp.

Required timestamp with time zone.

Invalid when: Null or after finished_at.

Platform gap fill

Conformance audit metadata.

ITD-022 Operational DDL Discipline

None.

Example: 2026-05-20T14:00:00Z

finished_at
timestamptz
Nullable; 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.

ITD-017 Conformance Evidence

None.

Example: 2026-05-20T14:04:30Z

status
text
Required; default 'running'

Run lifecycle status.

Must satisfy conformance_run_status_ck.

Invalid when: Outside enum set or inconsistent with child assertion statuses.

Allowed values: Conformance run status

Platform gap fill

Release evidence lifecycle.

ITD-017 Conformance Evidence

None.

Example: passed

summary
jsonb
Required; 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.

ITD-017 Conformance Evidence

None.

Example: {"examples":327,"assertions":28292,"failed":0}

Table

qti.conformance_assertion

Per-example and per-feature conformance evidence.

Gap fill row with 1EdTech pass-through values Primary key conformance_assertion_id

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

ITD-017 Conformance Evidence

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
uuid
Required; 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.

ITD-017 Conformance Evidence

None.

Example: 40bdfcf0-b97b-4a38-b308-a5d271a75943

conformance_run_id Foreign key
uuid
Required; 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.

ITD-017 Conformance Evidence

Belongs to exactly one qti.conformance_run.

Example: ed0065af-721c-4799-a48c-8ce0c5fdc7f2

assertion_key Unique with conformance_run_id
text
Required; 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.

ITD-017 Conformance Evidence

None.

Example: roundtrip:items/response-001.xml

artifact_ref
text
Nullable; 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: examples/qtiv3-examples/items/response-001.xml

spec_ref
text
Nullable; 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: imsqti_itemv3p0p1_v1p0.xsd#qti-assessment-item

status
text
Required; no default

Assertion result status.

Must satisfy conformance_assertion_status_ck.

Invalid when: Outside enum set, contradicts details, or failed/error without diagnostics.

Allowed values: Conformance assertion status

Platform gap fill

Generated assertion result lifecycle.

ITD-017 Conformance Evidence

None.

Example: passed

details
jsonb
Required; 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: {"canonicalHashMatched":true}

Global reference

Allowed Values

Every constrained value set includes behavioral meaning, provenance, and the architecture decision that authorizes it.

Allowed values

Package import status

qti.content_package.import_status content_package_import_status_ck Platform gap fill

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

IMS/QTI package resource type

qti.package_resource.resource_type IMS content-package resource type vocabulary 1EdTech pass-through

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Artifact kind

qti.artifact.artifact_kind artifact_kind_ck Platform gap fill

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Variable declaration kind

qti.variable_declaration.variable_kind variable_kind_ck 1EdTech pass-through

Values mirror QTI variable declaration categories: response, outcome, template, and context. ITD-013 Variable Declaration Projection, ITD-007 Provenance Labels.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Processing rule scope

qti.processing_rule.rule_scope processing_rule_scope_ck Platform gap fill

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Delivery session status

qti.delivery_session.status delivery_session_status_ck Platform gap fill

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Attempt status

qti.attempt.status attempt_status_ck Platform gap fill

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.

ValueBehaviorInvalid whenProvenance 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

Allowed values

Conformance run status

qti.conformance_run.status conformance_run_status_ck Platform gap fill

Release-evidence lifecycle values are platform gap fills. ITD-017 Conformance Evidence.

ValueBehaviorInvalid whenProvenance 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

ITD-017 Conformance Evidence

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

ITD-017 Conformance Evidence

failed At least one required assertion failed. Used outside qti.conformance_run.status, misspelled, or used contrary to this behavior. Platform gap fill

ITD-017 Conformance Evidence

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

ITD-017 Conformance Evidence

Allowed values

Conformance assertion status

qti.conformance_assertion.status conformance_assertion_status_ck Platform gap fill

Per-assertion lifecycle values are generated evidence about implementation behavior, not QTI content. ITD-017 Conformance Evidence.

ValueBehaviorInvalid whenProvenance 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

ITD-017 Conformance Evidence

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

ITD-017 Conformance Evidence

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

ITD-017 Conformance Evidence

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

ITD-017 Conformance Evidence

Allowed values

JSON projection lossiness

API projection metadata OpenAPI projection contract Platform gap fill

The platform names JSON projection lossiness because QTI defines XML, not public JSON projection envelopes. ITD-006 JSON Projection Boundaries, ITD-018 API Boundary.

ValueBehaviorInvalid whenProvenance 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

ITD-006 JSON Projection Boundaries, ITD-018 API Boundary

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

ITD-006 JSON Projection Boundaries, ITD-018 API Boundary