AlphaTest · Bank · Integrator API · Data dictionary v1

Every bank field, from request to proof

For the AcmeTest maintainer replacing hand-built banks: exact request, operation, Platform3 reference, manifest, error, and persistence shapes—with validation and source ownership visible at every field.

Cold integrator orientation

One operation, no translation layer

POST a Platform3 Content specId and bank mode. A request becomes an asynchronous operation only after every required dependency-contract preflight passes. For ready generated banks, use the returned Content and QTI IDs directly. Ready legacy verification is deliberately different: it returns non-assignable QTI↔Content alias proofs with no bank, form, package, or membership identity.

1 · CreatePOST /v1/bank-generations
2 · PollGET /v1/bank-operations/{operationId}
3 · AssignUse native IDs only if assignable=true
4 · AuditDownload the immutable manifest

Security boundary. All routes require a verified Bearer JWT. tenantId comes only from that token. A supplied X-Timeback-Tenant must match or the request returns 403. Cross-tenant and missing object lookups return the same 404.

Architecture: BANK-ITD-004, BANK-AXIS-006, BANK-AXIS-009.

Ownership and naming rules

Field family Owner Rule
operationId, status, hashes, manifest AlphaTest Bank Opaque orchestration/evidence only; never identifies learning content.
specId, bankId, formId Platform3 Content UUID pass-throughs, returned verbatim. specId is test_spec.spec_id.
packageId, artifactId, artifactVersionId, qtiIdentifier Platform3 QTI Verbatim. artifactVersionId is the immutable version handle.
caseIdentifier, caseUri Platform3 CASE Verbatim CFItem.identifier and absolute CFItem.uri; both resolve live.
generationRunId Incept Opaque provenance only. AlphaTest never persists/returns an item body or answer key.

Architecture: ITD-001, ITD-003, ITD-004.

Current release contract

Certification is capability-specific

same_blueprint_fixed_forms is owner-certified by SAME_BLUEPRINT_FIXED_FORMS-2026-07-21; its public create may return 202 after preflight. Adaptive generation and public legacy import remain independently typed-424 fail-closed until their own immutable-host ready/zero-gap receipts are published. One mode never opens another.

Route / modeRelease stateCurrent outcomeProof boundary
POST /v1/bank-generations · fixedOpen · owner-certified202 after preflightCertification SAME_BLUEPRINT_FIXED_FORMS-2026-07-21; positive operation bop_5WX5F484ZYGMHC9K58VSEMD5PP.
POST /v1/bank-generations · adaptiveClosed pending publication424; no operationCurrent immutable replay must reach ready/assignable=true/zero gaps with a stable non-null adaptivePool.
POST /v1/legacy-bank-importsVerification-only · public closedImmutable conformance may reach ready; public alias returns 424Load the governed collection, preserve its canonical hash, resolve all 17 aliases in owner order, and prove bankId=null, ownerMutationCount=0, assignable=false.

Release bindings: BANK-ITD-016; legacy identity and mutation boundary: BANK-ITD-028.

Executable binding provenance

Field familyWire owner / ruleTrace
specId, slot KC/DOK/count inputsVerbatim Content blueprint response; AlphaTest expands stable slots without copying the blueprint.BANK-ITD-004
caseIdentifier, caseUri, CASE hashes/statusVerbatim CASE CFItem identity plus safe verification evidence.BANK-ITD-005
packageId, artifactId, artifactVersionId, QTI hashesGenerated-bank-only native Content write-through/QTI read-back IDs and evidence. Legacy aliases use artifact/version/identifier only and forbid package identity.BANK-ITD-012
scoreProbes[], runtime outcome/tracePlatform3 QTI delivery-session/attempt proof; no answer body is persisted.BANK-ITD-007
checkpoint phase, hashes, attempts, native refsAlphaTest-owned replay metadata; every restart re-reads upstream state.BANK-ITD-014
conformance host/path/status/hash/native IDs/trace IDsSafe live-wire evidence; blocked dependencies make the run blocked, never locally green.BANK-ITD-016
adaptivePool root and ordered membersQTI owns the root and ordered native member identities. For each QTI member, Bank reconciles a Content contentId, reads GET .../items/{contentId}/kc-tags, and retains the exactly-one-primary KC relationship with its owner-published weight and confidence. It never becomes AlphaTest-owned selection state.BANK-ITD-017
aliases[17] legacy identity proofsRead-only reconciliation of native QTI artifact/version/identifier to exact Content content/version aliases. Historical proofs never contain or require packageId and never become generated FormRefs.BANK-ITD-028

Find a field

Endpoint contracts

POST /v1/bank-generations

Generate and verify from a Content test_spec

Requires bank:write. Fixed-form generation may return 202 after preflight under BANK-ITD-016. Adaptive generation returns 424 dependency_contract_unavailable before admission until its own certification is published. Any incomplete receipt terminates admitted work as failed with assignable=false, never ready.

Location / field Type Requirement Validation and meaning Trace
Authorization Bearer JWT Required Signed, unexpired; sub, role, tenantId, iat, exp; mapped scope includes bank:write. AXIS-006
Idempotency-Key ASCII string Required 1–255 visible ASCII chars; tenant + method + path scoped. Same key with changed canonical body returns 409. AXIS-005
Content-Type media type Required application/json; media parameters allowed. AXIS-008
body GenerationRequest Required Unknown properties rejected. AXIS-001

Conditional 202 response

Body: BankOperation. Headers: Location: /v1/bank-operations/{operationId}, strong ETag, integer-seconds Retry-After, JSON content type. An identical retry returns the same operation.

The bindings are pinned by BANK-ITD-011 and BANK-ITD-013; the per-mode release rule is pinned by BANK-ITD-016. Fixed-form callers may receive 202 after preflight under the published owner certification. Adaptive callers receive the documented 424 Problem until adaptive certification is published.

{"specId":"2d461e05-2148-4ec9-a4c0-eafc013cb8e7","bankMode":"same_blueprint_fixed_forms","formCount":5}
POST /v1/legacy-bank-imports

Verify the governed 17-form collection in place

Requires bank:write, JSON, and an Idempotency-Key. Incept is never called. The request names the single governed collection; it never supplies member IDs. Bank loads the owner-published manifest, preserves its canonical sha256: identity, and reads the 17 ordered QTI versions from the owner. A successful immutable replay reaches ready with assignable=false, bankId=null, ownerMutationCount=0, and aliases[17]. It creates no package, generated form, Content bank, membership, or other owner mutation.

FieldTypeRequirementValidationTrace
AuthorizationBearer JWTRequiredbank:write; tenant comes only from the verified JWT.AXIS-006
Idempotency-KeyASCII stringRequired1–255 visible ASCII chars; path and tenant are part of scope.AXIS-005
Content-Typemedia typeRequiredapplication/json; media parameters allowed.AXIS-008
bodyLegacyImportRequestRequiredUnknown properties and caller-supplied member/package/form IDs are rejected.ITD-028

Conditional 202 response

Body: BankOperation. Headers: Location, strong ETag, integer-seconds Retry-After, and JSON content type. Public admission remains typed-424 fail-closed until the legacy-specific ready/zero-gap receipt is published.

{
  "collectionKey": "timeback-alphatest-legacy-forms-v1"
}

BANK-ITD-028, BANK-ITD-016.

GET /v1/bank-operations

Reconcile generation and import operations

Requires bank:read. Filters combine with AND. Cursor binds filters/sort; changing them with the cursor returns 400.

Query Type Requirement Range / values
status OperationStatus Optional One exact value.
kind OperationKind Optional One exact value.
specId, bankId UUID Optional Exact native Content ID.
sort enum Optional -createdAt default, createdAt, -updatedAt, updatedAt; minus means descending.
limit integer Optional 1–100; default 25.
cursor opaque string Optional 1–2048 chars; returned here; never parse.
modifiedSince RFC 3339 Optional Inclusive updatedAt lower bound; UTC offset required.

200 response

{"items":[],"nextCursor":null,"hasMore":false}

items is always an array; nextCursor is string or null; hasMore is true exactly when nextCursor is non-null. Items are full operation objects.

BANK-AXIS-003, BANK-AXIS-007.

GET /v1/bank-operations/{operationId}

Read one snapshot

Requires bank:read. ID matches ^bop_[0-9A-HJKMNP-TV-Z]{26}$. Returns 200 BankOperation, strong ETag, and Retry-After while non-terminal. If-None-Match may return 304 with no body. Missing and other-tenant IDs both return 404.

AXIS-004, AXIS-009.

GET /v1/bank-operations/{operationId}/manifest

Download immutable verification evidence

Requires bank:read. Available only after terminal state; otherwise 409 manifest_not_ready. Returns EvidenceManifest with Cache-Control: private, immutable, strong ETag equal to quoted manifest hash, and attachment filename {operationId}-manifest.json.

Evidence, not a shadow bank. Hashes, IDs, verdicts, traces only—no prompt, stem, options, answer key, learner, response, attempt, or mastery data.

AXIS-010, AXIS-011, and adaptive receipt contract BANK-ITD-017.

Public objects

Request object

GenerationRequest

Field JSON type Requirement Range, meaning, source Trace
specId string(UUID) Required Content test_spec.spec_id, verbatim; tenant-resolvable with assessment_role=spec. Content test_spec
bankMode string enum Required same_blueprint_fixed_forms or qti_adaptive_selection. ITD-009
formCount integer Conditional Required for fixed; forbidden for adaptive. Positive integer and ≥ resolved Content spec min_forms. No AlphaTest-specific upper cap is pinned. ITD-009 · Content test_spec

Additional properties forbidden. Coverage, DOK, type mix, passing, overlap, and enemy-item rules are resolved live from Content; repeating them creates competing truth.

Request object

LegacyImportRequest

FieldJSON typeRequirement / nullValidationTrace
collectionKeystring enumRequired / never nullExactly timeback-alphatest-legacy-forms-v1. Bank resolves collectionId, canonical manifest hash, and all 17 ordered members from the owner; they are not request fields.ITD-028

Additional properties are forbidden. In particular qtiArtifactVersionIds, packageId, formId, formIndex, item bodies, prompts, answer keys, and CASE overrides reject with 400 validation_failed. A known UUID list is never identity proof.

Response object

BankOperation

Field Type Null? Meaning / values Trace
operationId string No AlphaTest opaque ID: bop_ + 26 Crockford Base32 chars. ITD-004
kind OperationKind No generation|legacy_import. AXIS-012
status, assignable enum, boolean No For kind=generation, assignable is true iff status is ready and the generated fixed/adaptive receipt is complete. For kind=legacy_import, the exact all-17 alias verification may be ready only with assignable=false; these historical proofs are intentionally non-assignable. ITD-002
phase OperationPhase No Current/last externally observable checkpoint. For kind=generation, exactly the nine-step GenerationPhase chain applies; for kind=legacy_import, exactly the six-step LegacyImportPhase chain applies. ITD-014
spec object No Generation only: live Content snapshot, never null. Omitted for legacy alias proof. ITD-004
spec.specIdstring(UUID)NoRequired for generation; verbatim Content test_spec ID. Omitted for legacy.ITD-004
spec.updatedAtstring(RFC3339)NoRequired for generation; Content snapshot version at UTC millisecond precision. Omitted for legacy.ITD-004
bankMode BankMode No Generation only: validated request echo. Omitted for legacy alias proof. ITD-009
progress object No Required progress counters object; never null. ITD-005
progress.totalSlots, progress.acceptedSlots, progress.quarantinedSlots, progress.formsRequested, progress.formsCompleteintegerNoAll five keys required and non-negative; accepted + quarantined ≤ total, formsComplete ≤ formsRequested.ITD-005
result BankResult Yes Null until result refs exist; presence does not mean assignable. ITD-004
manifestUrl relative URI Yes Null until terminal. AXIS-010
requestHash hex string No 64-char lowercase SHA-256 of canonical method/path/validated JSON. AXIS-005
createdAt, updatedAt RFC3339 No UTC millisecond precision; updated ≥ created. AXIS-007
completedAt RFC3339 Yes Non-null exactly when terminal. ITD-002
links object No Required relative-link object; never null. AXIS-002
links.selfstring(relative URI)NoRequired operation-detail path.AXIS-002
links.manifeststring(relative URI)|nullYesRequired key; null until terminal, then equals manifestUrl.AXIS-002
Nested response object

BankResult

Shape discriminator: kind=generation fixed results require forms; generated adaptive results require adaptiveSelection; kind=legacy_import requires exactly aliases[17] and omits both generated branches. Omitted means the JSON key is absent, not null. A LegacyAliasProof is not a FormRef.

JSON fieldJSON typeRequired / nullValidation and source
bankIdstring(UUID)|nullAlwaysGenerated fixed/adaptive: verbatim Content test_bank.bank_id, never null. Legacy import: exactly null because alias verification creates no bank.
membershipModeBankMode|nullAlwaysGenerated fixed/adaptive: mode read back from Content. Legacy import: exactly null because no membership is created.
formsarray<FormRef>Generated fixed only / never nullLength equals requested generated form count. Omitted for adaptive and legacy. FormRef always requires a real package ID and must never represent a pre-package alias.
forms[].formIndexintegerAlways in FormRef / never nullPositive, one-based, unique, contiguous; ascending verbatim Content form_index.
forms[].formIdstring(UUID)Always in FormRef / never nullVerbatim generated Content test form ID.
forms[].packageIdstring(UUID)Always in FormRef / never nullVerbatim generated QTI package ID. This field is forbidden in LegacyAliasProof.
forms[].artifactIdstring(UUID)Always in FormRef / never nullVerbatim generated QTI artifact ID.
forms[].artifactVersionIdstring(UUID)Always in FormRef / never nullVerbatim generated immutable QTI version ID.
forms[].qtiIdentifierstringAlways in FormRef / never null1–255 chars; generated native QTI identifier.
adaptiveSelectionAdaptiveSelectionRefGenerated adaptive only / never nullOmitted for fixed and legacy; its packageId, artifactId, artifactVersionId, and qtiIdentifier are all required verbatim generated QTI values.
sourceCollectionLegacySourceCollectionLegacy only / never nullOwner-read immutable collection identity. Omitted for generated fixed/adaptive results.
sourceCollection.collectionKeystring constantRequired in LegacySourceCollection / never nullExactly timeback-alphatest-legacy-forms-v1.
sourceCollection.collectionIdstring(UUID)Required in LegacySourceCollection / never nullVerbatim owner collection ID; never supplied or minted by the caller.
sourceCollection.manifestHashstringRequired in LegacySourceCollection / never nullsha256: plus 64 lowercase hexadecimal chars, preserved verbatim from the owner and matched to the governed identity.
sourceCollection.memberCountinteger constantRequired in LegacySourceCollection / never nullExactly 17; equals aliases.length.
aliasesarray<LegacyAliasProof>Legacy only / never nullExactly 17 entries in governed collection order; omitted for generated fixed/adaptive results. No entry may contain packageId, formId, or formIndex.
ownerMutationCountintegerLegacy only / never nullExactly 0. Any QTI or Content create/update/delete invalidates the operation; generated results omit this field.
membershipVerifiedAtstring(RFC3339)Generated only / never nullContent/QTI generated membership read-back time; omitted for legacy.
aliasesVerifiedAtstring(RFC3339)Legacy only / never nullUTC millisecond instant after all 17 read-only QTI-to-Content reconciliations pass.

ITD-004, ITD-009, ITD-028, QTI, and Content version aliases.

Legacy-only nested response object

LegacyAliasProof

One immutable, read-only identity reconciliation. It proves that QTI and Content names refer to the same historical form without minting a package or projecting the proof through generated membership.

JSON fieldJSON typeRequired / nullValidation and ownerTrace
ordinalintegerRequired / never null1–17; unique and contiguous. Array order and ordinal must agree with the owner-published collection.ITD-028
qti.artifactIdstring(UUID)Required / never nullVerbatim native QTI artifact ID read from the owner.ITD-028
qti.artifactVersionIdstring(UUID)Required / never nullVerbatim immutable QTI artifact-version ID; must equal the governed collection entry.ITD-028
qti.qtiIdentifierstringRequired / never null1–255 chars; verbatim native QTI identifier. qti.packageId is forbidden and must be absent.ITD-028
content.contentIdstring(UUID)Required / never nullExact owner Content alias for the QTI artifact.Content version
content.contentVersionIdstring(UUID)Required / never nullExact immutable Content version alias reconciled to qti.artifactVersionId.Content version
verifiedAtstring(RFC3339)Required / never nullUTC millisecond instant at which both owner reads agreed.ITD-003

Forbidden generated identity. Unknown properties are rejected. In particular, packageId, formId, and formIndex must be absent; null placeholders are also invalid.

Immutable evidence object

EvidenceManifest

Field Type Null? Validation / meaning Trace
schemaVersion integer No Exactly 1. AXIS-010
operationId, generatedAt string, RFC3339 No Parent operation and terminal creation instant. AXIS-010
request object No kind, requestHash, specId, specUpdatedAt, bankMode plus applicable count/source refs; no raw token/header. AXIS-010
upstreamCalls[] array No Each has service, HTTPS origin host, operationClass, safe requestId, nullable traceId, httpStatus 100–599, occurredAt. No URL query, auth, or body. ITD-003
converter object|null Yes {version,profile:"QTI-3.0",normalizedInputHash}; hash is lowercase SHA-256. Null for legacy import or when generation did not reach conversion. ITD-006
slots[] array No Exactly one per resolved blueprint slot, sorted by stable slotId. ITD-005
slots[].case object No caseIdentifier 1–255 and absolute HTTPS caseUri are verbatim CASE CFItem identity; resolvedAt is nullable when live resolution fails. CASE
slots[].requestedDok, requestedInteractionType enum, string No Resolved blueprint values; no silent relaxation. ITD-005
slots[].source object|null Yes generationRunId, responseHash, sourceHash; null for legacy import or when Incept returned no artifact. The run ID is verbatim; hashes are AlphaTest audit evidence. No source body. ITD-011
slots[].qti object|null Yes Native QTI refs and packageHash; null when conversion/ingest not reached. ITD-012
slots[].checks object No Booleans: caseResolved, dokMatched, interactionTypeMatched, qtiValidated, scoreProbePassed, membershipReadBack. ITD-005
slots[].verdict, slots[].reasonCodes enum, array No accepted only if all required checks true; else quarantined with non-empty stable reason codes. ITD-005
slots[].scoreProbes[] array No probeInputHash, expectedOutcome, actualOutcome, passed, runtimeTraceId; never the answer itself. ITD-007
gaps[] array No Each Gap has exactly slotId, boundary, code, detail, issueUrl, and proofMetric; see nested fields. No item body. ITD-008
membershipReadBack object|null Yes Exactly host, requestId, traceId, bankId, expectedMemberCount, actualMemberCount, mode, and verifiedAt; see nested fields. ITD-009
legacyProofLegacyProofReceipt objectLegacy terminal only / never nullRequired for kind=legacy_import terminal manifests and omitted for generation. Preserves the governed collection identity, all 17 ordered aliases, and the zero-mutation assertion.ITD-028
adaptivePool AdaptivePool object Conditional; never null Required exactly when request.bankMode=qti_adaptive_selection and the operation is ready; omitted for fixed forms and may be omitted for failed adaptive work whose receipt could not be completed. If present it is never null. Contains one QTI root and a non-empty ordered member list whose native identities and order are QTI-owned. Each member is reconciled to a Content contentId, then proves exactly one primary KC relationship from Content GET .../items/{contentId}/kc-tags. This receipt is evidence, never the selection source of truth. ITD-017
quarantinedArtifacts[] array No Upstream IDs/hashes, failure phase, cleanup state not_required|pending_upstream|retained_for_audit; never auto-deleted. ITD-012
timings object No Exactly non-negative integer queueMs, activeMs, and phaseMs entries; see nested fields. No readiness SLO implied. ITD-014
manifestHash hex string No 64-char SHA-256 of RFC 8785-canonical manifest with this field omitted. AXIS-010
EvidenceManifest deserialization contract

Every nested JSON key

The parent table defines which nested objects may be null. This table defines every serialized key inside them; additive response keys may appear and clients must ignore unknown keys. “Required” means present whenever the parent object is present.

JSON pathJSON typeRequired / nullValidation and ownershipTrace
request.kindOperationKind stringRequired / never nullValidated request discriminator.AXIS-010
request.requestHashstringRequired / never null64 lowercase hex SHA-256; equals the operation hash.AXIS-005
request.specIdstring(UUID)Required / never nullVerbatim Content test_spec ID.ITD-004
request.specUpdatedAtstring(RFC3339)Required / never nullContent snapshot version.ITD-004
request.bankModeBankMode stringRequired / never nullValidated mode.ITD-009
request.formCountintegerFixed generation only / never nullPositive integer and ≥ resolved Content spec min_forms; otherwise omitted. No AlphaTest-specific upper cap is pinned.ITD-009
request.collectionKeystring constantLegacy import only / never nullExactly timeback-alphatest-legacy-forms-v1; otherwise omitted. Member IDs and manifest identity are owner-read evidence, never caller input.ITD-028
upstreamCalls[].servicestring enumRequired / never nullincept|content|qti|case.ITD-003
upstreamCalls[].hoststring(HTTPS origin)Required / never nullOrigin only; no path, query, fragment, or credentials.ITD-003
upstreamCalls[].operationClassstringRequired / never null1–128 safe chars; capability name, not a raw URL.ITD-003
upstreamCalls[].requestIdstringRequired / never null1–128 safe correlation chars.ITD-003
upstreamCalls[].traceIdstring|nullRequired / nullable1–128 safe correlation chars when supplied.ITD-003
upstreamCalls[].httpStatusintegerRequired / never null100–599.ITD-003
upstreamCalls[].occurredAtstring(RFC3339)Required / never nullWire-call instant.ITD-003
converter.versionstringRequired when converter present / never null1–128 chars; AlphaTest converter release.ITD-006
converter.profilestring constantRequired when converter present / never nullExactly QTI-3.0.ITD-006
converter.normalizedInputHashstringRequired when converter present / never null64 lowercase hex SHA-256; no item body stored.ITD-006
slots[].slotIdstringRequired / never null1–255 stable blueprint slot ID; unique; array sorted ascending.ITD-005
slots[].case.caseIdentifierstringRequired / never null1–255 chars; verbatim CASE CFItem identifier.CASE
slots[].case.caseUristring(absolute HTTPS URI)Required / never nullVerbatim CASE CFItem URI.CASE
slots[].case.resolvedAtstring(RFC3339)|nullRequired / nullableLive CASE resolution instant; null only when caseResolved=false.ITD-005
slots[].source.generationRunIdstringRequired when source present / never nullNon-empty generationRunId returned verbatim by Incept manifest schema v1.ITD-011
slots[].source.responseHashstringRequired when source present / never null64 lowercase hex SHA-256 of the complete Incept response; the response body is not retained.ITD-011
slots[].source.sourceHashstringRequired when source present / never null64 lowercase hex SHA-256 of the returned artifact; the artifact body remains Incept-owned.ITD-011
slots[].qti.packageIdstring(UUID)Required when qti present / never nullVerbatim QTI package ID.ITD-012
slots[].qti.artifactIdstring(UUID)Required when qti present / never nullVerbatim QTI artifact ID.ITD-012
slots[].qti.artifactVersionIdstring(UUID)Required when qti present / never nullVerbatim immutable QTI version ID.ITD-012
slots[].qti.qtiIdentifierstringRequired when qti present / never null1–255 chars; native QTI identifier.ITD-012
slots[].qti.packageHashstringRequired when qti present / never null64 lowercase hex SHA-256.ITD-012
slots[].checks.caseResolved, dokMatched, interactionTypeMatched, qtiValidated, scoreProbePassed, membershipReadBackbooleanAll six required / never nullAudit verdicts; acceptance requires all applicable checks true.ITD-005
slots[].scoreProbes[].probeInputHashstringRequired / never null64 lowercase hex SHA-256; response input excluded.ITD-007
slots[].scoreProbes[].expectedOutcome, actualOutcomestringBoth required / never nullSafe normalized labels, never the answer.ITD-007
slots[].scoreProbes[].passedbooleanRequired / never nullTrue exactly when outcomes agree.ITD-007
slots[].scoreProbes[].runtimeTraceIdstringRequired / never null1–128 safe QTI runtime trace chars.ITD-007
gaps[].slotIdstringRequired / never nullReferences one manifest slot.ITD-008
gaps[].boundaryGapBoundary stringRequired / never nullUpstream seam that owns the gap.ITD-008
gaps[].codesnake_case stringRequired / never nullStable machine reason; additive values allowed.ITD-008
gaps[].detailstringRequired / never nullSafe explanation; no item, answer, learner, or raw body.ITD-008
gaps[].issueUrlstring(absolute HTTPS URI)Required / never nullUpstream Issue containing the reproducer and proof metric.ITD-008
gaps[].proofMetricstringRequired / never nullConcrete condition proving closure.ITD-008
membershipReadBack.hoststring(HTTPS origin)Required when object present / never nullPlatform3 Content origin only.ITD-009
membershipReadBack.requestIdstringRequired when object present / never nullSafe request correlation ID.ITD-009
membershipReadBack.traceIdstring|nullRequired / nullableSafe trace ID when supplied.ITD-009
membershipReadBack.bankIdstring(UUID)Required when object present / never nullVerbatim Content test_bank ID.ITD-009
membershipReadBack.expectedMemberCount, actualMemberCountintegerBoth required / never nullNon-negative; equal for ready.ITD-009
membershipReadBack.modeBankMode stringRequired when object present / never nullMode read back from Content.ITD-009
membershipReadBack.verifiedAtstring(RFC3339)Required when object present / never nullRead-back instant.ITD-009
legacyProof.sourceCollection.collectionKeystring constantRequired in LegacyProofReceipt / never nullExactly timeback-alphatest-legacy-forms-v1.ITD-028
legacyProof.sourceCollection.collectionIdstring(UUID)Required / never nullVerbatim owner collection ID.ITD-028
legacyProof.sourceCollection.manifestHashstringRequired / never nullsha256: plus 64 lowercase hexadecimal chars, preserved verbatim.ITD-028
legacyProof.sourceCollection.memberCountinteger constantRequired / never nullExactly 17.ITD-028
legacyProof.aliasesarray<LegacyAliasProof>Required / never nullExactly 17 entries; identical order and identities to BankResult.aliases.ITD-028
legacyProof.ownerMutationCountinteger constantRequired / never nullExactly 0.ITD-028
legacyProof.aliasesVerifiedAtstring(RFC3339)Required / never nullUTC millisecond instant after all owner reads and the zero-mutation assertion pass.ITD-028
adaptivePool.packageIdstring(UUID)Required in AdaptivePool / never nullVerbatim tenant-owned QTI root package ID.ITD-017
adaptivePool.artifactIdstring(UUID)Required in AdaptivePool / never nullVerbatim QTI root artifact ID.ITD-017
adaptivePool.artifactVersionIdstring(UUID)Required in AdaptivePool / never nullVerbatim immutable QTI root artifact-version ID.ITD-017
adaptivePool.qtiIdentifierstringRequired in AdaptivePool / never null1–255 chars; package-scoped native QTI identifier.ITD-017
adaptivePool.packageHashstringRequired in AdaptivePool / never null64 lowercase hexadecimal SHA-256 of the reconciled QTI root package.ITD-017
adaptivePool.members[]array<AdaptivePoolMember>Required in AdaptivePool / never null or emptyOne entry per QTI package member, serialized in the authoritative QTI package order; array position is order and no separate order field is emitted.ITD-017
adaptivePool.members[].artifactIdstring(UUID)Required in every member / never nullVerbatim QTI member artifact ID; unique within the array and proven to belong to the root package.ITD-017
adaptivePool.members[].artifactVersionIdstring(UUID)Required in every member / never nullVerbatim immutable QTI member artifact-version ID; unique within the array.ITD-017
adaptivePool.members[].qtiIdentifierstringRequired in every member / never null1–255 chars; package-scoped native QTI member identifier; unique within the root package.ITD-017
adaptivePool.members[].contentIdstring(UUID)Required in every member / never nullVerbatim Content item ID reconciled from the member’s immutable QTI identity before KC proof is read.ITD-017 · Content
adaptivePool.members[].primaryKnowledgeComponentPrimaryKnowledgeComponentProof objectRequired in every member / never nullThe single primary relationship returned by Content GET .../items/{contentId}/kc-tags. Zero or multiple primary relationships fail closed; no KC metadata is required on or added to QTI item refs.ITD-017 · Content
adaptivePool.members[].primaryKnowledgeComponent.knowledgeComponentGuidstring(UUID)Required / never nullVerbatim Content-owned KC GUID; must equal the KC GUID assigned to the generated blueprint slot for this member.ITD-017
adaptivePool.members[].primaryKnowledgeComponent.weightnumberRequired / never nullFinite owner-published Content relationship weight in the inclusive range 0..1; retained verbatim.ITD-017
adaptivePool.members[].primaryKnowledgeComponent.confidencenumberRequired / never nullFinite owner-published Content relationship confidence in the inclusive range 0..1; retained verbatim.ITD-017
quarantinedArtifacts[].packageId, artifactId, artifactVersionIdstring(UUID)|nullAll required / nullableVerbatim QTI refs; null when not created.ITD-012
quarantinedArtifacts[].artifactHashstring|nullRequired / nullable64 lowercase hex SHA-256 when artifact existed.ITD-012
quarantinedArtifacts[].failurePhaseOperationPhase stringRequired / never nullPhase that prevented acceptance; exactly one phase from the operation kind's pinned chain.ITD-014
quarantinedArtifacts[].cleanupStatestring enumRequired / never nullnot_required|pending_upstream|retained_for_audit.ITD-012
timings.queueMs, activeMsintegerBoth required / never nullNon-negative elapsed milliseconds.ITD-014
timings.phaseMsobject<OperationPhase,integer>Required / never nullKeys are only phases entered from the operation kind's pinned chain; each value is a non-negative integer millisecond duration.ITD-014

All nested objects remain conformance evidence under BANK-AXIS-010; the prohibited-content boundary is BANK-AXIS-011.

application/problem+json

Problem

Field Type Requirement Meaning
type absolute HTTPS URI Required https://api.alphatest.app/problems/bank/{code}, stable.
title, detail string Required Stable summary + safe instance explanation; clients branch on code.
status, code integer, snake_case Required Status matches HTTP; code stable.
requestId, traceId string Required 1–128 safe correlation chars; never credential.
fieldErrors[] array<FieldError> Optional Present only when one or more request fields failed; never null or empty when present.
fieldErrors[].pathstring(JSON Pointer)Required in FieldErrorPath to the rejected request field.
fieldErrors[].codesnake_case stringRequired in FieldErrorStable field-level machine code.
fieldErrors[].messagestringRequired in FieldErrorSafe field-level explanation.
upstreamErrors[] array<UpstreamError> Optional Present only for a sanitized upstream failure; never null or empty when present.
upstreamErrors[].servicestring enumRequired in UpstreamErrorincept|content|qti|case.
upstreamErrors[].codesnake_case stringRequired in UpstreamErrorSanitized stable upstream category; never a raw envelope.
upstreamErrors[].requestIdstringRequired in UpstreamError1–128 safe upstream correlation chars.
dependencystring enumRequired only for dependency_contract_unavailable; otherwise absentincept|content|qti|case. Names the upstream contract owner, not a capability or copied local service.
capabilitystring enumRequired only for dependency_contract_unavailable; otherwise absentresolve_spec|resolve_standards|generate_items|ingest_qti|score_qti|register_fixed_forms|register_adaptive_pool|read_bank_membership|resolve_legacy_qti_identity|wire_release_gate. Identifies the exact failed upstream seam; wire_release_gate means the isolated-tenant conformance run in BANK-ITD-016 is not yet certified.
sourceUrlabsolute HTTPS URLRequired only for dependency_contract_unavailable; otherwise absentPublished upstream contract or descriptor URL checked by preflight; credentials and query secrets prohibited.
probeResultDependencyProbeResultRequired only for dependency_contract_unavailable; otherwise absentSafe descriptor/conformance result; never includes an upstream body.
probeResult.statusinteger|nullRequired in DependencyProbeResult / nullableHTTP status 100–599 when a response existed; null for missing configuration or transport failure.
probeResult.codesnake_case stringRequired in DependencyProbeResult / never null1–64 chars; stable safe category such as contract_not_published or capability_not_supported.
probeResult.checkedAtstring(RFC3339)Required in DependencyProbeResult / never nullUTC preflight instant.

Base envelope: BANK-AXIS-008. Dependency extension: BANK-ITD-016.

Copyable response fixtures

Complete JSON examples

These are complete serialized shapes, with no schema placeholders. UUIDs, hashes, timestamps, and correlation IDs are illustrative. Omitted conditional keys are called out in the captions; unknown additive response keys must be ignored. The ready-operation and fixed-form manifest fixtures are contract-shape examples and deliberately use non-real operation ID bop_01K0BANKEXAMP5E00000000000. Fixed creation is currently certified, but illustrative fixtures do not impersonate the published wire receipt. The adaptive result/receipt fixtures describe the contract after adaptive certification; the 424 fixture is the current adaptive fail-closed response.

Exact legacy-import result — ready alias proof, never assignable

This complete all-17 fixture is the runtime target for the immutable owner replay. It contains no forms, adaptiveSelection, packageId, or fabricated bank identity; ownerMutationCount=0 proves the read-only boundary.

{
  "operationId": "bop_01K0AEGACYEXAMP5E000000000",
  "kind": "legacy_import",
  "status": "ready",
  "assignable": false,
  "phase": "terminal",
  "progress": {
    "totalSlots": 17,
    "acceptedSlots": 17,
    "quarantinedSlots": 0,
    "formsRequested": 0,
    "formsComplete": 0
  },
  "result": {
    "bankId": null,
    "membershipMode": null,
    "sourceCollection": {
      "collectionKey": "timeback-alphatest-legacy-forms-v1",
      "collectionId": "6fab7bef-7606-4861-a79c-5b44e42ab37c",
      "manifestHash": "sha256:26fdf6aa3b942920ac771dd70f00015082af2edc6a40f3d9549f9b38d1e2d4ea",
      "memberCount": 17
    },
    "aliases": [
      {
        "ordinal": 1,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000001",
          "artifactVersionId": "20000000-0000-4000-8000-000000000001",
          "qtiIdentifier": "timeback-alphatest-legacy-01"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000001",
          "contentVersionId": "40000000-0000-4000-8000-000000000001"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 2,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000002",
          "artifactVersionId": "20000000-0000-4000-8000-000000000002",
          "qtiIdentifier": "timeback-alphatest-legacy-02"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000002",
          "contentVersionId": "40000000-0000-4000-8000-000000000002"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 3,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000003",
          "artifactVersionId": "20000000-0000-4000-8000-000000000003",
          "qtiIdentifier": "timeback-alphatest-legacy-03"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000003",
          "contentVersionId": "40000000-0000-4000-8000-000000000003"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 4,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000004",
          "artifactVersionId": "20000000-0000-4000-8000-000000000004",
          "qtiIdentifier": "timeback-alphatest-legacy-04"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000004",
          "contentVersionId": "40000000-0000-4000-8000-000000000004"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 5,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000005",
          "artifactVersionId": "20000000-0000-4000-8000-000000000005",
          "qtiIdentifier": "timeback-alphatest-legacy-05"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000005",
          "contentVersionId": "40000000-0000-4000-8000-000000000005"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 6,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000006",
          "artifactVersionId": "20000000-0000-4000-8000-000000000006",
          "qtiIdentifier": "timeback-alphatest-legacy-06"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000006",
          "contentVersionId": "40000000-0000-4000-8000-000000000006"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 7,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000007",
          "artifactVersionId": "20000000-0000-4000-8000-000000000007",
          "qtiIdentifier": "timeback-alphatest-legacy-07"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000007",
          "contentVersionId": "40000000-0000-4000-8000-000000000007"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 8,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000008",
          "artifactVersionId": "20000000-0000-4000-8000-000000000008",
          "qtiIdentifier": "timeback-alphatest-legacy-08"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000008",
          "contentVersionId": "40000000-0000-4000-8000-000000000008"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 9,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000009",
          "artifactVersionId": "20000000-0000-4000-8000-000000000009",
          "qtiIdentifier": "timeback-alphatest-legacy-09"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000009",
          "contentVersionId": "40000000-0000-4000-8000-000000000009"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 10,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000010",
          "artifactVersionId": "20000000-0000-4000-8000-000000000010",
          "qtiIdentifier": "timeback-alphatest-legacy-10"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000010",
          "contentVersionId": "40000000-0000-4000-8000-000000000010"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 11,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000011",
          "artifactVersionId": "20000000-0000-4000-8000-000000000011",
          "qtiIdentifier": "timeback-alphatest-legacy-11"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000011",
          "contentVersionId": "40000000-0000-4000-8000-000000000011"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 12,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000012",
          "artifactVersionId": "20000000-0000-4000-8000-000000000012",
          "qtiIdentifier": "timeback-alphatest-legacy-12"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000012",
          "contentVersionId": "40000000-0000-4000-8000-000000000012"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 13,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000013",
          "artifactVersionId": "20000000-0000-4000-8000-000000000013",
          "qtiIdentifier": "timeback-alphatest-legacy-13"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000013",
          "contentVersionId": "40000000-0000-4000-8000-000000000013"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 14,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000014",
          "artifactVersionId": "20000000-0000-4000-8000-000000000014",
          "qtiIdentifier": "timeback-alphatest-legacy-14"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000014",
          "contentVersionId": "40000000-0000-4000-8000-000000000014"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 15,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000015",
          "artifactVersionId": "20000000-0000-4000-8000-000000000015",
          "qtiIdentifier": "timeback-alphatest-legacy-15"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000015",
          "contentVersionId": "40000000-0000-4000-8000-000000000015"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 16,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000016",
          "artifactVersionId": "20000000-0000-4000-8000-000000000016",
          "qtiIdentifier": "timeback-alphatest-legacy-16"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000016",
          "contentVersionId": "40000000-0000-4000-8000-000000000016"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      },
      {
        "ordinal": 17,
        "qti": {
          "artifactId": "10000000-0000-4000-8000-000000000017",
          "artifactVersionId": "20000000-0000-4000-8000-000000000017",
          "qtiIdentifier": "timeback-alphatest-legacy-17"
        },
        "content": {
          "contentId": "30000000-0000-4000-8000-000000000017",
          "contentVersionId": "40000000-0000-4000-8000-000000000017"
        },
        "verifiedAt": "2026-07-24T14:32:10.000Z"
      }
    ],
    "ownerMutationCount": 0,
    "aliasesVerifiedAt": "2026-07-24T14:32:10.000Z"
  },
  "manifestUrl": "/v1/bank-operations/bop_01K0AEGACYEXAMP5E000000000/manifest",
  "requestHash": "1717171717171717171717171717171717171717171717171717171717171717",
  "createdAt": "2026-07-24T14:30:01.000Z",
  "updatedAt": "2026-07-24T14:32:10.000Z",
  "completedAt": "2026-07-24T14:32:10.000Z",
  "links": {
    "self": "/v1/bank-operations/bop_01K0AEGACYEXAMP5E000000000",
    "manifest": "/v1/bank-operations/bop_01K0AEGACYEXAMP5E000000000/manifest"
  }
}

Conditional EvidenceManifest legacyProof — complete all-17 receipt

For a terminal kind=legacy_import manifest, this object is the top-level legacyProof value. Its collection identity is owner-read evidence, its aliases match BankResult.aliases byte-for-byte in order, and it contains no generated package or membership identity.

{
  "sourceCollection": {
    "collectionKey": "timeback-alphatest-legacy-forms-v1",
    "collectionId": "6fab7bef-7606-4861-a79c-5b44e42ab37c",
    "manifestHash": "sha256:26fdf6aa3b942920ac771dd70f00015082af2edc6a40f3d9549f9b38d1e2d4ea",
    "memberCount": 17
  },
  "aliases": [
    {
      "ordinal": 1,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000001",
        "artifactVersionId": "20000000-0000-4000-8000-000000000001",
        "qtiIdentifier": "timeback-alphatest-legacy-01"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000001",
        "contentVersionId": "40000000-0000-4000-8000-000000000001"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 2,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000002",
        "artifactVersionId": "20000000-0000-4000-8000-000000000002",
        "qtiIdentifier": "timeback-alphatest-legacy-02"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000002",
        "contentVersionId": "40000000-0000-4000-8000-000000000002"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 3,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000003",
        "artifactVersionId": "20000000-0000-4000-8000-000000000003",
        "qtiIdentifier": "timeback-alphatest-legacy-03"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000003",
        "contentVersionId": "40000000-0000-4000-8000-000000000003"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 4,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000004",
        "artifactVersionId": "20000000-0000-4000-8000-000000000004",
        "qtiIdentifier": "timeback-alphatest-legacy-04"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000004",
        "contentVersionId": "40000000-0000-4000-8000-000000000004"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 5,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000005",
        "artifactVersionId": "20000000-0000-4000-8000-000000000005",
        "qtiIdentifier": "timeback-alphatest-legacy-05"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000005",
        "contentVersionId": "40000000-0000-4000-8000-000000000005"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 6,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000006",
        "artifactVersionId": "20000000-0000-4000-8000-000000000006",
        "qtiIdentifier": "timeback-alphatest-legacy-06"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000006",
        "contentVersionId": "40000000-0000-4000-8000-000000000006"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 7,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000007",
        "artifactVersionId": "20000000-0000-4000-8000-000000000007",
        "qtiIdentifier": "timeback-alphatest-legacy-07"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000007",
        "contentVersionId": "40000000-0000-4000-8000-000000000007"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 8,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000008",
        "artifactVersionId": "20000000-0000-4000-8000-000000000008",
        "qtiIdentifier": "timeback-alphatest-legacy-08"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000008",
        "contentVersionId": "40000000-0000-4000-8000-000000000008"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 9,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000009",
        "artifactVersionId": "20000000-0000-4000-8000-000000000009",
        "qtiIdentifier": "timeback-alphatest-legacy-09"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000009",
        "contentVersionId": "40000000-0000-4000-8000-000000000009"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 10,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000010",
        "artifactVersionId": "20000000-0000-4000-8000-000000000010",
        "qtiIdentifier": "timeback-alphatest-legacy-10"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000010",
        "contentVersionId": "40000000-0000-4000-8000-000000000010"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 11,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000011",
        "artifactVersionId": "20000000-0000-4000-8000-000000000011",
        "qtiIdentifier": "timeback-alphatest-legacy-11"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000011",
        "contentVersionId": "40000000-0000-4000-8000-000000000011"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 12,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000012",
        "artifactVersionId": "20000000-0000-4000-8000-000000000012",
        "qtiIdentifier": "timeback-alphatest-legacy-12"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000012",
        "contentVersionId": "40000000-0000-4000-8000-000000000012"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 13,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000013",
        "artifactVersionId": "20000000-0000-4000-8000-000000000013",
        "qtiIdentifier": "timeback-alphatest-legacy-13"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000013",
        "contentVersionId": "40000000-0000-4000-8000-000000000013"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 14,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000014",
        "artifactVersionId": "20000000-0000-4000-8000-000000000014",
        "qtiIdentifier": "timeback-alphatest-legacy-14"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000014",
        "contentVersionId": "40000000-0000-4000-8000-000000000014"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 15,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000015",
        "artifactVersionId": "20000000-0000-4000-8000-000000000015",
        "qtiIdentifier": "timeback-alphatest-legacy-15"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000015",
        "contentVersionId": "40000000-0000-4000-8000-000000000015"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 16,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000016",
        "artifactVersionId": "20000000-0000-4000-8000-000000000016",
        "qtiIdentifier": "timeback-alphatest-legacy-16"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000016",
        "contentVersionId": "40000000-0000-4000-8000-000000000016"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    },
    {
      "ordinal": 17,
      "qti": {
        "artifactId": "10000000-0000-4000-8000-000000000017",
        "artifactVersionId": "20000000-0000-4000-8000-000000000017",
        "qtiIdentifier": "timeback-alphatest-legacy-17"
      },
      "content": {
        "contentId": "30000000-0000-4000-8000-000000000017",
        "contentVersionId": "40000000-0000-4000-8000-000000000017"
      },
      "verifiedAt": "2026-07-24T14:32:10.000Z"
    }
  ],
  "ownerMutationCount": 0,
  "aliasesVerifiedAt": "2026-07-24T14:32:10.000Z"
}

Illustrative 202/200 BankOperation — fixed-form generation contract

{
  "operationId": "bop_01K0BANKEXAMP5E00000000000",
  "kind": "generation",
  "status": "ready",
  "assignable": true,
  "phase": "terminal",
  "spec": {
    "specId": "2d461e05-2148-4ec9-a4c0-eafc013cb8e7",
    "updatedAt": "2026-07-15T14:00:00.000Z"
  },
  "bankMode": "same_blueprint_fixed_forms",
  "progress": {
    "totalSlots": 20,
    "acceptedSlots": 20,
    "quarantinedSlots": 0,
    "formsRequested": 1,
    "formsComplete": 1
  },
  "result": {
    "bankId": "19d7bc3d-bb8f-44d7-820f-b487b2288961",
    "membershipMode": "same_blueprint_fixed_forms",
    "forms": [{
      "formIndex": 1,
      "formId": "eb89be0d-3ad4-440e-9002-b5be4965babc",
      "packageId": "d6f79061-c548-46ed-a9f3-b8c338745164",
      "artifactId": "c31f607a-38ca-42da-8bc5-02ca79ea7770",
      "artifactVersionId": "4f4c18f4-c2ec-4278-97e2-2b07a3070d91",
      "qtiIdentifier": "alphatest-g5-math-form-a"
    }],
    "membershipVerifiedAt": "2026-07-15T14:02:09.225Z"
  },
  "manifestUrl": "/v1/bank-operations/bop_01K0BANKEXAMP5E00000000000/manifest",
  "requestHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "createdAt": "2026-07-15T14:00:01.002Z",
  "updatedAt": "2026-07-15T14:02:09.225Z",
  "completedAt": "2026-07-15T14:02:09.225Z",
  "links": {
    "self": "/v1/bank-operations/bop_01K0BANKEXAMP5E00000000000",
    "manifest": "/v1/bank-operations/bop_01K0BANKEXAMP5E00000000000/manifest"
  }
}

Conditional BankResult — adaptive discriminator branch after certification

For qti_adaptive_selection, adaptiveSelection is present and forms is absent.

{
  "bankId": "19d7bc3d-bb8f-44d7-820f-b487b2288961",
  "membershipMode": "qti_adaptive_selection",
  "adaptiveSelection": {
    "packageId": "d6f79061-c548-46ed-a9f3-b8c338745164",
    "artifactId": "c31f607a-38ca-42da-8bc5-02ca79ea7770",
    "artifactVersionId": "4f4c18f4-c2ec-4278-97e2-2b07a3070d91",
    "qtiIdentifier": "alphatest-g5-math-adaptive-pool"
  },
  "membershipVerifiedAt": "2026-07-15T14:02:09.225Z"
}

Illustrative 200 EvidenceManifest — fixed-form contract

{
  "schemaVersion": 1,
  "operationId": "bop_01K0BANKEXAMP5E00000000000",
  "generatedAt": "2026-07-15T14:02:09.225Z",
  "request": {
    "kind": "generation",
    "requestHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "specId": "2d461e05-2148-4ec9-a4c0-eafc013cb8e7",
    "specUpdatedAt": "2026-07-15T14:00:00.000Z",
    "bankMode": "same_blueprint_fixed_forms",
    "formCount": 1
  },
  "upstreamCalls": [{
    "service": "incept",
    "host": "https://incept.example",
    "operationClass": "skill-pack-generate",
    "requestId": "incept_req_01JZBANK",
    "traceId": null,
    "httpStatus": 200,
    "occurredAt": "2026-07-15T14:00:03.011Z"
  }],
  "converter": {
    "version": "1.0.0",
    "profile": "QTI-3.0",
    "normalizedInputHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  },
  "slots": [{
    "slotId": "slot-math-5-nf-001",
    "case": {
      "caseIdentifier": "TX-TEKS-5.3K",
      "caseUri": "https://case.example/items/TX-TEKS-5.3K",
      "resolvedAt": "2026-07-15T14:00:02.100Z"
    },
    "requestedDok": "dok2",
    "requestedInteractionType": "choiceInteraction",
    "source": {
      "generationRunId": "gen_01JZBANK",
      "responseHash": "abababababababababababababababababababababababababababababababab",
      "sourceHash": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
    },
    "qti": {
      "packageId": "d6f79061-c548-46ed-a9f3-b8c338745164",
      "artifactId": "c31f607a-38ca-42da-8bc5-02ca79ea7770",
      "artifactVersionId": "4f4c18f4-c2ec-4278-97e2-2b07a3070d91",
      "qtiIdentifier": "alphatest-g5-math-item-001",
      "packageHash": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
    },
    "checks": {
      "caseResolved": true,
      "dokMatched": true,
      "interactionTypeMatched": true,
      "qtiValidated": true,
      "scoreProbePassed": true,
      "membershipReadBack": true
    },
    "verdict": "accepted",
    "reasonCodes": [],
    "scoreProbes": [{
      "probeInputHash": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
      "expectedOutcome": "correct",
      "actualOutcome": "correct",
      "passed": true,
      "runtimeTraceId": "qti_trace_01JZBANK"
    }]
  }],
  "gaps": [],
  "membershipReadBack": {
    "host": "https://platform3.example",
    "requestId": "content_req_01JZBANK",
    "traceId": "content_trace_01JZBANK",
    "bankId": "19d7bc3d-bb8f-44d7-820f-b487b2288961",
    "expectedMemberCount": 1,
    "actualMemberCount": 1,
    "mode": "same_blueprint_fixed_forms",
    "verifiedAt": "2026-07-15T14:02:09.225Z"
  },
  "quarantinedArtifacts": [],
  "timings": {
    "queueMs": 110,
    "activeMs": 128113,
    "phaseMs": {
      "spec_resolved": 502,
      "standards_resolved": 400,
      "generated": 84200,
      "converted": 5130,
      "qti_ingested": 12781,
      "scoring_proved": 22100,
      "content_registered": 2000,
      "membership_read_back": 1000
    }
  },
  "manifestHash": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
}

Conditional EvidenceManifest adaptivePool — complete adaptive receipt after certification

This complete conditional object is inserted as the top-level adaptivePool key in the EvidenceManifest example above when request.bankMode=qti_adaptive_selection. The fixed-form example correctly omits the key.

{
  "packageId": "d6f79061-c548-46ed-a9f3-b8c338745164",
  "artifactId": "c31f607a-38ca-42da-8bc5-02ca79ea7770",
  "artifactVersionId": "4f4c18f4-c2ec-4278-97e2-2b07a3070d91",
  "qtiIdentifier": "alphatest-g5-math-adaptive-pool",
  "packageHash": "1212121212121212121212121212121212121212121212121212121212121212",
  "members": [{
    "artifactId": "38aa8fa7-ce58-45db-86e1-6d57c7509990",
    "artifactVersionId": "2a12f7c6-0be0-4bb0-9683-c5be6b385f29",
    "qtiIdentifier": "alphatest-g5-math-item-001",
    "contentId": "10000000-0000-4000-8000-000000000004",
    "primaryKnowledgeComponent": {
      "knowledgeComponentGuid": "7eebf680-fab4-4abe-98c7-826934371001",
      "weight": 1,
      "confidence": 1
    }
  }]
}

Conditionality, native QTI identity/order, QTI→Content reconciliation, and the exactly-one-primary Content kc-tags proof: BANK-ITD-017.

500 Problem — stable fallback branch

{
  "type": "https://api.alphatest.app/problems/bank/internal_error",
  "title": "Internal server error",
  "detail": "The request could not be completed.",
  "status": 500,
  "code": "internal_error",
  "requestId": "req_01JZBANK000000000000000000",
  "traceId": "trace_01JZBANK00000000000000"
}

424 Problem — dependency contract unavailable

{
  "type": "https://api.alphatest.app/problems/bank/dependency_contract_unavailable",
  "title": "Dependency contract unavailable",
  "detail": "Adaptive bank generation cannot be admitted until tenant-aligned QTI authority and adaptive-pool conformance are certified.",
  "status": 424,
  "code": "dependency_contract_unavailable",
  "requestId": "req_01JZBANK000000000000000001",
  "traceId": "trace_01JZBANK00000000000001",
  "dependency": "qti",
  "capability": "register_adaptive_pool",
  "sourceUrl": "https://platform3-andymontgomery-9773s-projects.vercel.app/qti/1edtech/customer_website",
  "probeResult": {
    "status": 403,
    "code": "forbidden",
    "checkedAt": "2026-07-20T15:13:34.339Z"
  }
}

Examples instantiate BankOperation, BankResult, EvidenceManifest, and Problem; field provenance remains on those source tables.

Errors by endpoint

Status / code Applies When
400 validation_failed All Malformed path/query/header/body or invalid cross-field combination.
401 authentication_required All Missing/invalid/expired token.
403 insufficient_scope / tenant_mismatch All Scope absent or compatibility header differs from JWT.
404 resource_not_found Create, detail, manifest Missing/cross-tenant spec, QTI ref, or operation; indistinguishable.
409 idempotency_conflict POSTs Same key, different request.
409 spec_contract_violation POSTs Spec role/mode/min-forms cannot admit request.
409 manifest_not_ready Manifest Operation non-terminal.
415 unsupported_media_type POSTs Not JSON.
424 dependency_contract_unavailable POSTs A dependency required by the requested capability is missing, its safe descriptor/conformance probe fails, or that specific capability is not certified. Returns dependency, capability, sourceUrl, and probeResult; creates no operation and performs no upstream mutation.
429 rate_limited All Admission bound; includes Retry-After.
500 internal_error All Unexpected AlphaTest failure. The response is the documented Problem envelope with safe detail and correlation IDs; clients may retry a GET, or retry a POST with the same Idempotency-Key.

Pre-admission dependency failures are always the typed 424 above, replacing the older ambiguous 502/503 branches. Post-admission failures live in the operation/manifest, never retroactively as HTTP errors. Raw upstream envelopes never pass through.

Persistence dictionary

API-fronted datastore. Server-only tables. Every addressable key/index starts with tenant_id. Service credentials stay server-side; tenant comes from verified JWT, never request body/path.

Security and tenancy: BANK-ITD-015, BANK-AXIS-006, BANK-AXIS-009. Minimal persistence and retention boundary: BANK-AXIS-011.

Owned table · bank

bank_operation

Owned orchestration state: BANK-ITD-002, BANK-ITD-014, BANK-ITD-015.

Column Type Null/default Constraints / public mapping
tenant_id text NOT NULL 1–128 verified claim; never returned.
operation_id text NOT NULL bop_…; composite PK / operationId.
kind, status, phase enums NOT NULL kind=generation|legacy_import; status=queued|running|ready|ready_with_gaps|failed|cancelled; phase is constrained to the matching kind-scoped checkpoint chain.
spec_id uuid NOT NULL External Content ref, no local FK / spec.specId.
spec_updated_at timestamptz NOT NULL Content snapshot marker.
bank_mode enum NOT NULL same_blueprint_fixed_forms|qti_adaptive_selection; public bankMode.
request_hash char(64) NOT NULL Lowercase hex; raw body not stored.
request_refs jsonb NOT NULL Generation: exactly {formCount} for fixed mode or {} for adaptive. Legacy: exactly {collectionKey}, fixed to the governed collection; owner member IDs are not persisted from caller input. No body, token, or tenant.
progress jsonb NOT NULL Exactly five non-negative counters documented above.
result_refs jsonb NULL Null before a result exists; otherwise the validated reference-only BankResult object. It contains only Platform3 IDs, mode, indexes, hashes, and read-back time.
created_at, updated_at timestamptz NOT NULL / now() updated ≥ created.
completed_at timestamptz NULL Null iff non-terminal.
Owned table · bank

bank_idempotency

Retry identity and tenant isolation: BANK-AXIS-005, BANK-ITD-015.

Column Type Null Constraints
tenant_id text NOT NULL Verified claim, first key.
method, path text NOT NULL Uppercase method; normalized versioned path, no query.
idempotency_key text NOT NULL 1–255 visible ASCII.
request_hash char(64) NOT NULL Changed-retry detector.
operation_id text NOT NULL Composite FK with tenant to operation.
created_at timestamptz NOT NULL Audit time.
Owned table · bank

bank_upstream_checkpoint

ID/hash-only resumability and phase progression: BANK-ITD-014, BANK-AXIS-011, BANK-ITD-015.

Column Type Null Constraints
tenant_id, operation_id text NOT NULL Composite FK; tenant mandatory.
checkpoint_seq integer NOT NULL ≥0, unique within operation.
phase OperationPhase enum NOT NULL One of the 13-value OperationPhase union, constrained to the operation's kind-scoped GenerationPhase or LegacyImportPhase chain.
service enum NOT NULL alphatest|incept|content|qti|case. alphatest is required for converter/terminal checkpoints that have no upstream owner.
reference_hashes jsonb NOT NULL Object with only these optional non-null strings: requestId, traceId, generationRunId (1–128 safe chars); contentId, contentVersionId, packageId, artifactId, artifactVersionId (UUID); requestHash, responseHash, canonicalHash (64 lowercase hex). At least one key; no body, answer, URL query, or credential.
http_status smallint NULL 100–599 for an upstream HTTP checkpoint; null only when service=alphatest or no response existed.
retry_count smallint NOT NULL ≥0.
occurred_at timestamptz NOT NULL Wire call/checkpoint instant.
Owned table · bank

bank_evidence_manifest

Immutable evidence, not shadow content: BANK-AXIS-010, BANK-AXIS-011, BANK-ITD-015.

Column Type Null Constraints
tenant_id, operation_id text NOT NULL Composite PK/FK.
schema_version smallint NOT NULL Currently 1, positive.
manifest jsonb NOT NULL Validated public object; insert terminal, immutable.
manifest_hash char(64) NOT NULL Unique per tenant, equals manifestHash.
created_at timestamptz NOT NULL Manifest creation.

Keys, indexes, migrations, retention

Composite tenant keys and API-fronted access: BANK-ITD-015. Idempotent write identity: BANK-AXIS-005.

Name Definition Purpose
bank_operation_pkey PK (tenant_id, operation_id) No unscoped object lookup.
bank_operation_reconcile_idx (tenant_id, updated_at DESC, operation_id DESC) Stable cursor + modifiedSince.
bank_operation_filter_idx (tenant_id,status,kind,updated_at DESC) Reconciliation filters.
bank_operation_spec_idx (tenant_id,spec_id,created_at DESC) Spec filter.
bank_operation_bank_idx (tenant_id,(result_refs->>'bankId')) WHERE result_refs IS NOT NULL Native bank filter without shadow Content table.
bank_idempotency_unique UNIQUE (tenant_id,method,path,idempotency_key) Retry safety.
bank_checkpoint_pkey PK (tenant_id,operation_id,checkpoint_seq) Replay/resume order.
bank_manifest_pkey PK (tenant_id,operation_id) One terminal manifest.

Ownership: bank alone creates/migrates these objects. Idempotent migrations use CREATE TABLE IF NOT EXISTS, additive ADD COLUMN IF NOT EXISTS, transactional indexes. Native upstream IDs are external refs, never cross-schema FKs. Other modules use the API.

Retention (BANK-AXIS-011): configured audit policy; this dictionary does not invent a duration. Privileged internal deletion never cascades upstream and has no v1 endpoint. Idempotency lives at least as long as its operation. No item body, answer key, roster, learner, response, attempt, score, or mastery field is permitted.

Allowed values

Enum Values Rule
OperationKind generation, legacy_import Single collection discriminator.
OperationStatus queued, running, ready, ready_with_gaps, failed, cancelled Last four terminal; only ready assignable.
OperationPhase (union) spec_resolved, standards_resolved, generated, converted, qti_ingested, owner_collection_read, all_versions_read, aliases_reconciled, scoring_proved, content_registered, membership_read_back, zero_mutation_asserted, terminal Exactly 13 distinct values. The union is a storage/deserialization type only; valid progression is selected by kind.
GenerationPhase spec_resolved → standards_resolved → generated → converted → qti_ingested → scoring_proved → content_registered → membership_read_back → terminal Exactly nine ordered phases for kind=generation, matching BANK-ITD-014 verbatim.
LegacyImportPhase owner_collection_read → all_versions_read → aliases_reconciled → scoring_proved → zero_mutation_asserted → terminal Exactly six ordered phases for kind=legacy_import, matching BANK-ITD-014 verbatim. content_registered and membership_read_back are invalid for legacy; zero_mutation_asserted proves ownerMutationCount=0 before terminal.
BankMode same_blueprint_fixed_forms, qti_adaptive_selection Content membership vs QTI adaptive structure.
DOK dok1, dok2, dok3, dok4 Verbatim Content blueprint.
SlotVerdict accepted, quarantined No partial acceptance.
GapBoundary incept, converter, platform3_qti, platform3_case, platform3_content Owner of failing seam.

Unknown response enum values may be added compatibly and clients must tolerate them. Unknown request values reject. Removal/rename/meaning change requires a new major path.

Cross-field invariants

  1. formCount required only for fixed generation and ≥ Content min_forms; adaptive forbids it.
  2. Legacy v1 accepts only the owner-read governed collection selected by collectionKey=timeback-alphatest-legacy-forms-v1; the caller supplies no member, package, or form identities. Bank must preserve all 17 owner-ordered aliases, and no reduced or substituted set is valid.
  3. For generated banks, assignable=true iff ready and the fixed/adaptive receipt is complete. Legacy alias verification is ready only when exactly 17 QTI↔Content proofs reconcile with ownerMutationCount=0, and it always has assignable=false and bankId=null.
  4. ready_with_gaps is terminal/non-assignable, requires ≥1 gap, and only where blueprint policy permits an audit result.
  5. Failed/cancelled are non-assignable; created upstream refs appear as quarantine evidence.
  6. Fixed form count equals request, indexes contiguous; adaptive has one adaptiveSelection and no forms. Every ready adaptive manifest has one non-null adaptivePool with at least one ordered member; missing, null, incomplete, or unreconciled evidence makes the operation failed and non-assignable. Fixed manifests omit that key.
  7. Every adaptivePool root/member identity reconciles to the same tenant-owned QTI package; each ordered member reconciles to one Content contentId whose GET .../items/{contentId}/kc-tags result contains exactly one primary relationship matching the generated blueprint-slot KC. The manifest retains that relationship’s owner-published knowledgeComponentGuid, weight, and confidence; missing, duplicate-primary, mismatched, or unreconciled proof fails closed. QTI item refs need no KC arrays. Member identifiers and immutable version IDs are unique, and repeat reads preserve both the strong ETag and canonical manifestHash.
  8. Every accepted slot has complete CASE/QTI/scoring/membership evidence; false required check quarantines.
  9. Secrets and item/answer bodies are prohibited before persistence and therefore excluded from hashes.
  10. A create request yields 202 only after the requested capability's own preflight passes. Fixed, adaptive, and legacy certification are independent. A 424 creates no operation, idempotency row, checkpoint, evidence row, or upstream mutation and never disables a certified sibling capability.

Provenance

No vendor/ exists. This adapts the approved local architecture and live Platform3 pass-through contracts. AlphaTest-owned fields are confined to request, operation, evidence, error, and minimal orchestration persistence—not a local content model.