AlphaTest / Bank / Integrator API / Architecture

One request to an assignable, verified Platform3 bank

For the AcmeTest maintainer replacing hand-authored forms: this registry pins every API axis, every upstream boundary, and every condition that must be proved before Bank creation is adoption-ready.

FIXED FORMS OWNER-CERTIFIED · OTHER MODES FAIL CLOSED. BANK-ITD-016 publishes SAME_BLUEPRINT_FIXED_FORMS-2026-07-21 with release_state=ready, backed by positive operation bop_5WX5F484ZYGMHC9K58VSEMD5PP; public fixed-form creates may return 202. Adaptive and legacy remain independently typed-424 closed until their own ready/zero-gap receipts are explicitly published. Immutable conformance is bound to reviewer-bank and the configured QTI platform tenant UUID, uses distinct per-service credentials, and treats only ready as a passing terminal.

Certification map

Who. The AcmeTest engineer’s tech lead certifying the integration before client code is written.

Job. Verify that no consequential choice will be discovered during integration.

12 / 12standard API axes pinned
10 / 10bank-specific seams pinned
0AlphaTest-owned item bodies, scores, pools, or memberships
3independent capability gates
CapabilityCurrent release postureRequired terminal proof
Fixed mastery-gate formsOpen · owner-certified
SAME_BLUEPRINT_FIXED_FORMS-2026-07-21
Authenticated create returns 202; live Incept generation produces N forms; QTI ingest/scoring and Content registration/read-back yield assignable native test IDs. Positive receipt: bop_5WX5F484ZYGMHC9K58VSEMD5PP.
AdaptiveClosed pending publicationExact replay bop_3BZPK6BKJ91MS9RP4VXRAYR7KG must reach ready/assignable:true/zero gaps. QTI proves the six-member order; Content kc-tags proves exactly one matching primary KC per member. Stable alias stays unchanged until the receipt is published.
17-form legacy alias proofClosed pending publicationLoad timeback-alphatest-legacy-forms-v1, preserve its sha256: identity, resolve all 17 owner aliases in order, return bankId:null / ownerMutationCount:0 / assignable:false, and terminate ready/zero gaps on the exact immutable deployment.
Required seamDecisionRelease proof
Incept skill-pack generationSHIP · manifest v1Authenticated slot returns ok:true, outcome:artifact, run ID, artifact hash.
Per-slot standard / DOK / TEI verificationSHIPLive CASE identity plus exact requested values.
Misconception-tagged distractor verificationSHIPEvery wrong selected-response choice retains one distinct named Incept misconception through QTI conversion and owner read-back; invalid mappings quarantine the item.
Incept JSON → QTI 3.0SHIPDeterministic package hash and validator pass.
Platform3 QTI ingest and scoringSHIP / SHIPNative IDs, read-back hash, correct-response runtime outcome.
Content test_bank registrationSHIPCreate + replay + authoritative Content state/detail/member read-back; fixed mastery gates additionally require a same-tenant Administration create acceptance probe.
Adaptive-pool evidence projectionSHIP · publication gatedRoot + ordered identities come from QTI; each member’s exactly-one primary KC comes from Content GET .../items/{contentId}/kc-tags; repeat reads preserve ETag/hash.
Unsupported type reportingSHIPSlot-level manifest gap and linked upstream issue; never substitution.
17 legacy TimeBack formsSHIP · publication gatedThe governed collection—not a caller list—is loaded; its sha256: identity and 17 ordered QTI version→artifact→Content aliases agree; the proof returns aliases[17] without creating a bank, membership, or any owner mutation.
Weak-item regeneration and rotationSHIPA Reports revision order triggers live Incept replacement; complete re-verification precedes append-only Content membership rotation with old/new provenance.

Wire flow and release boundary

  1. Bind the immutable envelope. Use caller tenant reviewer-bank (33979ed1-36ac-4973-8b2e-181f311c0d5f) plus the exact server-configured QTI_PLATFORM_TENANT_ID on one immutable hostname; never demo fixtures.
  2. Authorize by owner. Require distinct server-held Content, QTI, and CASE credentials (plus Incept for generation); no shared PLATFORM3_JWT fallback.
  3. Resolve and generate. Read the Content test_spec and CASE identities, then invoke live Incept manifest v1 and generation.
  4. Convert and score. Deterministically turn returned artifacts into QTI 3.0, ingest, read native identity, and score the expected answer through Platform3 QTI.
  5. Reconcile adaptive ownership. Preserve QTI root/member order, join every native member to Content, and require exactly one primary Content KC matching its blueprint slot.
  6. Replay legacy ownership without mutation. Load timeback-alphatest-legacy-forms-v1, validate its canonical hash, resolve all 17 ordered aliases, and assert bankId:null, ownerMutationCount:0, and assignable:false.
  7. Assert, don’t merely poll. Fixed, adaptive, and legacy must each terminate ready with zero gaps and sanitized traces; any other terminal fails conformance.
  8. Prove isolation. The owning tenant reads 200; the same resource under another tenant and an unknown ID share one non-enumerating 404 shape.
  9. Publish per mode. Fixed is published now. Adaptive and legacy public admission stay 424 until their own receipts are explicitly recorded; one lane cannot open another.

Public API boundary

Method and pathDecisionSuccess boundary
POST /v1/bank-generationsOne fixed-form or adaptive operation; Idempotency-Key required.202 when the requested mode is certified and its preflight passes. Fixed certification is independent of adaptive.
POST /v1/legacy-bank-importsThe governed all-17 collection; never regeneration, caller-supplied membership, or owner mutation.202 only after legacy certification and tenant-scoped identity preflight; ready returns aliases[17], bankId:null, ownerMutationCount:0, assignable:false.
GET /v1/bank-operationsTenant list with bounded filters, sort, cursor, modifiedSince.200 page.
GET /v1/bank-operations/{operationId}Phase, counts, terminal refs, ETag.200 tenant-scoped snapshot.
GET /v1/bank-operations/{operationId}/manifestImmutable audit evidence, exact upstream gaps, and for terminal adaptive operations the adaptivePool receipt.200 only for the owning tenant; repeat reads preserve ETag and canonical hash.

Request/response field schemas belong to the next data-dictionary deliverable. This architecture pins the behavior, ownership, protocol boundaries, and rejection rules implementation must inherit.

Pinned decisions

BANK-ITD-001ACTIVE · SHIP

One owner for every fact

Chosen. AlphaTest owns generation workflow state, deterministic Incept-JSON→QTI conversion code, slot-verification policy, and audit composition only. Incept owns generated source items; CASE owns standards; Content/QTI own specs, forms, banks, packages, keys, and scoring.

Alternatives rejected.
  • Copy item bodies or answer keys into AlphaTest
  • Make AcmeTest coordinate four upstreams

Rationale. One orchestrator removes manual glue without creating a shadow source of truth.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-002ACTIVE · SHIP

One observable asynchronous operation

Chosen. After the requested capability's dependency preflight passes, generation or legacy alias-proof import returns 202 with one stable operation URI and runtime terminal states ready, ready_with_gaps, failed, or cancelled. For generated fixed/adaptive banks, only ready with that capability's complete owner receipt may be assignable; for legacy alias proof, ready means all 17 owner aliases were proven with bankId:null, ownerMutationCount:0, and assignable:false. The immutable release-conformance suite is stricter than ordinary runtime observation: fixed, adaptive, and all-17-legacy replay are three required assertions, and each MUST terminate ready with zero gaps before the suite can record certification—merely reaching failed or another terminal is a failed assertion, never a pass.

Alternatives rejected.
  • Long synchronous HTTP across generation and scoring
  • Return a bank ID before owner-authorized proof
  • Count failed as an acceptable conformance terminal
  • Use ready with assignable:false for an incomplete adaptive result
  • Treat a complete legacy alias proof as an assignable bank

Rationale. Separating runtime state from the conformance pass predicate preserves observable failures without allowing a test harness to certify them.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-17 · Author: alphatest-triage+2026-07-17-005 · supersedes: none · superseded_by: none

BANK-ITD-003ACTIVE · SHIP

Real upstream calls are a readiness invariant

Chosen. Production operations and immutable conformance call the configured Incept, Content, QTI, and CASE origins at runtime and retain sanitized host, method, operation, status, native identity or hash, request/trace ID, and timestamp. Conformance binds the verified reviewer-bank caller tenant to the exact server-configured QTI platform tenant UUID; demo fixtures, copied owner data, and local mocks can never produce ready or a certification receipt.

Alternatives rejected.
  • Local mock fallback
  • Copied CASE or local scoring logic
  • Hardcode the demo caller tenant or demo QTI tenant UUID

Rationale. Behavior without tenant-exact upstream wire evidence is not integration.

Status: active · Outcome: SHIP · Date: 2026-07-17 · Author: alphatest-triage+2026-07-17-005 · supersedes: none · superseded_by: none

BANK-ITD-004ACTIVE · SHIP

Platform-native identifiers cross the boundary

Chosen. Generation requests accept Content specId; generated-bank success returns Content bankId/formId, QTI packageId/artifactId/artifactVersionId, and CASE identifiers verbatim. Legacy alias-proof success instead returns exactly 17 ordered owner aliases with bankId:null, ownerMutationCount:0, and assignable:false. AlphaTest adds only operationId and proof metadata; known legacy UUIDs remain untrusted until tenant-aligned owner reads reconcile them.

Alternatives rejected.
  • AlphaTest ID translation table
  • Titles, source strings, or a recovered UUID list as identity proof

Rationale. AcmeTest can assign and deliver without translation glue, while owner authority—not local possession of an identifier—establishes identity.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-005ACTIVE · SHIP

Every blueprint slot must pass independently

Chosen. Admit an item only when primary CASE identity, DOK, requested interaction, QTI validation, Platform3 correct-response score, and provenance all pass. Quarantine failures by upstream reference; partial forms never join a bank.

Alternatives rejected.
  • Sample or aggregate-only verification
  • Silent DOK/type relaxation

Rationale. One invalid item breaks the gate claim.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-006ACTIVE · SHIP

Deterministic Incept JSON to QTI 3.0 conversion

Chosen. The converter maps Incept artifact semantics to canonical QTI 3.0 XML, response declarations/processing, accessibility metadata, media resources, and CASE tags. Equal normalized input plus converter version yields the same package hash; conversion may reject but never rewrite content.

Alternatives rejected.
  • LLM-authored XML after generation
  • QTI 2.x intermediate or semantic improvement

Rationale. Replayable conversion with no second author.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-007ACTIVE · SHIP

Platform3 QTI is the scoring oracle

Chosen. For every converted item, submit the Incept expected response through a pseudonymous QTI delivery session and attempt; require the documented correct score and applied processing trace, then bind source hash, QTI version ID, input hash, outcome, and trace ID.

Alternatives rejected.
  • Inspect responseProcessing locally
  • Sampled score checks or a real learner identity

Rationale. Proves the production scorer, not AlphaTest's interpretation.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-008ACTIVE · SHIP

Unsupported capability becomes an upstream issue

Chosen. If Incept cannot generate, the converter cannot represent, or QTI cannot score a requested type, record the exact slot and boundary, open/link an upstream Issue with a reproducer and proof metric, and return only a non-assignable audit result when blueprint policy permits.

Alternatives rejected.
  • Downgrade TEI to multiple choice
  • Generic failure with no slot evidence

Rationale. Protects rigor and creates a falsifiable reopen event.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-009ACTIVE · SHIP

Fixed-form and adaptive membership stay distinct

Chosen. same_blueprint_fixed_forms creates ordered bank_member references with positive form_index; qti_adaptive_selection creates the Content bank but keeps selection/pool structure inside QTI and creates no fabricated fixed member list.

Alternatives rejected.
  • One generic member-array interpretation
  • AlphaTest-owned bank membership

Rationale. Preserves distinct fixed/adaptive semantics and Content ownership.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-028ACTIVE · SHIP

Prove all 17 legacy aliases without owner mutation

Chosen. Immutable conformance MUST load the owner-published timeback-alphatest-legacy-forms-v1 collection for the configured reviewer-bank/QTI tenant binding, validate its canonical sha256:<64 lowercase hex> manifest identity without rewriting it, read all 17 ordered artifactVersionIds from QTI, reconcile each owning artifactId and Content alias, and verify CASE/scoring/provenance. It returns aliases[17] in governed order with bankId:null, ownerMutationCount:0, and assignable:false: legacy import is an alias-proof operation and MUST NOT create a Content test_bank, bank_member rows, QTI artifacts, or any other owner mutation. The conformance assertion passes only when that exact immutable-deployment operation terminates ready with zero gaps and sanitized QTI/Content receipts. Public legacy admission remains fail-closed until its mode-specific positive receipt is explicitly published. Never regenerate, register, mutate, reduce the set, substitute local IDs, or treat a known ID list alone as authority.

Alternatives rejected.
  • Regeneration
  • Use a caller-supplied or recovered 17-UUID list instead of loading the governed collection
  • Strip the sha256: identity prefix
  • Treat failed as an acceptable conformance terminal
  • Register the 17 forms into a new Content bank or membership collection
  • Treat aliases as assignable or return a non-null bankId

Rationale. An alias proof makes all 17 existing owner records import-visible with provenance while preserving the accepted zero-mutation boundary and preventing AlphaTest from inventing a second legacy bank.

Owning sources. source contract · source contract

Status: active · Outcome: SHIP · Date: 2026-07-24 · Author: alphatest-triage+2026-07-24-007 · supersedes: BANK-ITD-010 · superseded_by: none

BANK-ITD-011ACTIVE · SHIP

Bind generation to Incept manifest schema v1

Chosen. Fetch GET https://incept-skill-pack.vercel.app/api/skill-pack before a run and require schemaVersion===1, generation endpoint equality, bearer auth, available question skill, and declared request/response schemas. POST one slot with skillId:"question", canonical subject/grade, parameters.mode:"brainlift", CASE URI/identifier in parameters.target, the exact manifest-enumerated parameters.dok and parameters.interactionType, and intent.purpose:"assessment". Accept only HTTP 2xx with ok:true, outcome:"artifact", nonempty generationRunId, and artifact; preserve run ID and response hash. A requested interaction outside the live enum or a blocked outcome is a slot gap, never locally reconstructed.

Alternatives rejected.
  • Infer a private schema from validation errors
  • Batch slots under undocumented correlation/idempotency semantics

Rationale. The owner-published versioned envelope is executable; one-slot calls give AlphaTest stable correlation without inventing Incept fields.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: BANK-ITD-019 · superseded_by: none

BANK-ITD-012ACTIVE · SHIP

Ingest QTI once through Content write-through

Chosen. Submit deterministic QTI 3.0 ZIP once to Content’s QTI-package import with server auth and child idempotency key; require 202, trusted import, and created native IDs, then read each QTI delivery JSON by returned version ID and verify identity plus canonical hash. Never double-ingest through QTI.

Alternatives rejected.
  • Direct QTI ingest plus Content copy
  • Trust Content 202 without QTI evidence

Rationale. One mutation owner plus D5 read-back.

Owning sources. source contract · source contract

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-013ACTIVE · SHIP

Register and read back Content-owned banks

Chosen. For generated fixed/adaptive capabilities, create content_kind:"test_bank" through Content’s authenticated, idempotent item-create endpoint only after owner identities are reconciled. Fixed mode writes ordered bank_member references with exact Content/QTI aliases; adaptive mode writes no fabricated fixed member rows because selection remains QTI-owned. Require item detail and the mode-appropriate authoritative read-back before assignable ready. Legacy alias proof is excluded from this mutation contract: it returns bankId:null, ownerMutationCount:0, assignable:false and creates no Content test_bank or bank_member rows.

Alternatives rejected.
  • Write Content tables directly
  • Create a parallel AlphaTest membership record
  • Register known legacy UUIDs before tenant-aligned QTI owner reads
  • Create Content membership for a legacy alias-proof operation

Rationale. Content remains authoritative for generated banks, while the explicit legacy exclusion prevents an alias-proof read from being laundered into an unauthorized owner mutation.

Owning sources. source contract · source contract · source contract

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: BANK-ITD-022 · superseded_by: none

BANK-ITD-014ACTIVE · SHIP

Checkpoint only orchestration state

Chosen. All operations begin admitted only after capability preflight. Generation advances through spec_resolved → standards_resolved → generated → converted → qti_ingested → scoring_proved → content_registered → membership_read_back → terminal. Legacy alias proof advances through owner_collection_read → all_versions_read → aliases_reconciled → scoring_proved → zero_mutation_asserted → terminal; content_registered and membership_read_back are invalid legacy phases. Restart generation by re-reading upstream identity/hash before replaying an idempotent child write; restart legacy only with owner reads and an assertion that ownerMutationCount remains zero.

Alternatives rejected.
  • One opaque processing flag
  • Skip owner reads because the 17 UUIDs are known
  • Upstream bodies in checkpoints or destructive rollback
  • Reuse generation's Content registration phases for legacy alias proof

Rationale. Artifact-class-specific checkpoints make recovery safe and make the legacy zero-mutation invariant mechanically visible instead of silently passing through registration phases.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-015ACTIVE · SHIP

API-fronted, tenant-claim-scoped storage

Chosen. Supabase/Postgres is server-only; service credentials never reach clients. Every operation, idempotency, checkpoint, and evidence query includes the verified JWT tenant claim; cross-tenant identifiers return indistinguishable 404.

Alternatives rejected.
  • Direct browser database access
  • Global lookup then application filtering

Rationale. No anonymous or cross-tenant data path.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-016ACTIVE · SHIP

Independent capability receipts open release

Chosen. Certification and public admission are capability-specific, never global. Owner release certification SAME_BLUEPRINT_FIXED_FORMS-2026-07-21 is published with release_state=ready on the previously wire-verified basis: authenticated Incept artifacts since 2026-07-16, Content test_spec create/read/idempotent-replay conflict (platform3#787), QTI ingest/scoring, governed source catalog ITD-033 release_state=ready, conforming per-tenant three-slot credentials 7/7, and positive operation bop_5WX5F484ZYGMHC9K58VSEMD5PP. Public same_blueprint_fixed_forms creates are therefore admitted and return 202 after preflight. This certification cannot open qti_adaptive_selection or legacy import: each remains typed-424 fail-closed until its own current immutable-deployment ready/zero-gap receipt is explicitly published. The immutable conformance envelope itself MUST bind caller tenant reviewer-bank (33979ed1-36ac-4973-8b2e-181f311c0d5f) to the exact configured QTI_PLATFORM_TENANT_ID, use distinct server-held Content/QTI/CASE credentials with no PLATFORM3_JWT fallback, replay fixed, adaptive, and timeback-alphatest-legacy-forms-v1 all-17 operations on that same immutable hostname, require ready as the only passing terminal for all three, retain sanitized owner traces, and prove an owning-tenant 200 versus same-shape cross-tenant 404. Stable production-alias admission changes only after the relevant mode-specific certification receipt is recorded.

Alternatives rejected.
  • One all-or-nothing public gate across fixed, adaptive, and legacy
  • Keep fixed forms closed after the spec owner published its positive certification
  • Let a green fixed receipt certify adaptive or legacy
  • Run conformance against demo or accept a shared-token fallback
  • Count failed as a passing terminal
  • Implementation-only 202/ready simulation

Rationale. An explicit owner release artifact breaks the fixed-form adoption deadlock while tenant-exact, per-mode receipts keep unproved capabilities and cross-tenant paths fail-closed under DoD D2 and D5.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-21 · Author: alphatest-triage+2026-07-21-002 · supersedes: BANK-ITD-025 · superseded_by: none

BANK-AXIS-001ACTIVE · SHIP

One operation per public write

Chosen. POST creates one generation or legacy-import operation after preflight; no public item-authoring or multi-bank atomic endpoint.

Alternatives rejected.
  • Per-item authoring
  • Bulk banks

Rationale. Clearest retry and ownership boundary.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-002ACTIVE · SHIP

List, detail, and immutable manifest

Chosen. Expose operation list/detail and manifest subresource; bank/form bodies remain direct Platform3 reads through returned IDs.

Alternatives rejected.
  • List-only diagnostics
  • Proxying a shadow content catalog

Rationale. Diagnose workflows without duplicating Content/QTI.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-003ACTIVE · SHIP

Bounded filters and opaque cursor paging

Chosen. Filter operations by status, kind, specId, bankId, and RFC3339 modifiedSince; sort createdAt/updatedAt; page by opaque cursor with bounded limit.

Alternatives rejected.
  • Free-form search
  • Arbitrary query expressions

Rationale. Reconciliation without leaking storage grammar.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-004ACTIVE · SHIP

Immutable requests and native upstream ETags

Chosen. No public PATCH/PUT; snapshots return ETags for cache validation. Each upstream mutation requiring If-Match uses the ETag read from that same tenant resource.

Alternatives rejected.
  • Mutable generation inputs
  • Guessed or cached upstream ETags

Rationale. Reproducible execution plus native optimistic concurrency.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-005ACTIVE · SHIP

Tenant-scoped idempotency on every POST

Chosen. Every public POST requires Idempotency-Key. Same tenant/key and canonical request returns the same operation; changed method/path/body returns typed 409. Deterministic child keys isolate upstream writes.

Alternatives rejected.
  • Client operation IDs alone
  • One reused key for all children

Rationale. Lost-response safety without duplicate mutation.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-006ACTIVE · SHIP

Verified JWT plus explicit bank scopes

Chosen. Require a signed unexpired caller Bearer JWT with sub,role,tenantId,iat,exp; reads require bank:read and writes bank:write. Upstream calls use distinct server-held least-privilege CONTENT_SERVICE_TOKEN, QTI_SERVICE_TOKEN, and CASE_SERVICE_TOKEN credentials (plus the separate Incept credential where generation runs). No slot may fall back to PLATFORM3_JWT, another service's token, the caller token, or a demo mint; missing, mismatched, expired, or under-scoped credentials fail closed before certification.

Alternatives rejected.
  • Role-only auth
  • Client-held Incept/Platform3 tokens
  • Shared PLATFORM3_JWT fallback
  • Reuse one service token across Content, QTI, and CASE

Rationale. Per-service credentials make least privilege observable and remove the shared-token cross-service blast radius.

Status: active · Outcome: SHIP · Date: 2026-07-17 · Author: alphatest-triage+2026-07-17-005 · supersedes: none · superseded_by: none

BANK-AXIS-007ACTIVE · DEFERRED

Polling ships; webhooks have a concrete trigger

Chosen. v1 ships polling, Retry-After, ETag, and modifiedSince. Webhooks reopen when a registered external consumer proves polling misses a documented assignment-latency SLO and supplies a signed-callback receiver.

Alternatives rejected.
  • Webhook infrastructure before a consumer/SLO
  • Silent background completion with no reconciliation

Rationale. Current job is met with one reliable primitive; trigger is concrete and falsifiable.

Status: active · Outcome: DEFERRED · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-008ACTIVE · SHIP

Typed RFC 7807 errors

Chosen. Every non-2xx is application/problem+json with stable type/title/status/detail/code/requestId/traceId and optional safe field/upstream arrays; never expose tokens, item bodies, or answer keys.

Alternatives rejected.
  • Raw upstream errors
  • Ad hoc per-route JSON

Rationale. One branchable client contract and no leakage.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-009ACTIVE · SHIP

Verified JWT claim controls tenant routing

Chosen. Public paths have no tenant parameter. Derive the AlphaTest tenant only from the verified JWT; compatibility X-Timeback-Tenant must equal the claim or returns 403, and scope every local/upstream operation to it. Immutable conformance additionally requires server configuration that maps reviewer-bank to its exact QTI platform tenant UUID and signs that UUID into the deployment-host-bound envelope; the request cannot choose or override the mapping. Reads for a valid identifier owned by another tenant return the same RFC 7807 resource_not_found 404 shape as an unknown identifier.

Alternatives rejected.
  • URL-authoritative tenant
  • Header-authoritative tenant
  • Caller-selected QTI tenant UUID
  • Different cross-tenant and absent-resource errors

Rationale. Caller-controlled routing cannot cross tenants or enumerate another tenant's resources.

Status: active · Outcome: SHIP · Date: 2026-07-17 · Author: alphatest-triage+2026-07-17-005 · supersedes: none · superseded_by: none

BANK-AXIS-010ACTIVE · SHIP

Contract and integration proof travel together

Chosen. One immutable-host conformance run covers fixed, adaptive, and the governed all-17 legacy alias-proof operation under the configured reviewer-bank/QTI tenant binding, while producing three independent mode receipts. Every assertion requires status=ready and zero gaps; failed, cancelled, ready_with_gaps, timeout, or missing evidence fails the suite. Receipts retain sanitized Content/QTI/CASE/Incept host, method, status, native IDs/hashes, request/trace IDs, and timestamps; prove distinct credential slots, public-alias fail-closed behavior for uncertified modes, anonymous rejection, same-shape 404 cross-tenant isolation, idempotency conflict, QTI scoring, generated-bank Content registration/read-back, adaptive QTI-order plus Content-KC reconciliation, and exact all-17 alias replay with bankId:null, ownerMutationCount:0, assignable:false. A green fixed receipt cannot certify adaptive or legacy, and a later failed sibling replay cannot revoke the already published fixed certification.

Alternatives rejected.
  • Unit tests alone
  • One aggregate pass/fail bit with no mode receipts
  • Treat any terminal state as conformance success
  • Manifests without independently observed calls

Rationale. Strict per-mode assertions inside one tenant-exact envelope produce auditable adoption evidence without coupling public release decisions.

Status: active · Outcome: SHIP · Date: 2026-07-17 · Author: alphatest-triage+2026-07-17-005 · supersedes: none · superseded_by: none

BANK-AXIS-011ACTIVE · SHIP

Keep audit metadata, never learning content

Chosen. Persist tenant-scoped operation metadata, upstream IDs, hashes, states, and audit evidence—never item bodies, keys, learner data, attempts, or mastery. Privileged deletion never cascades to Platform3.

Alternatives rejected.
  • Copied request/artifact bodies
  • Cascading upstream delete

Rationale. Auditability within AlphaTest's ownership boundary.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-AXIS-012ACTIVE · SHIP

One operation collection; no shadow catalog

Chosen. /bank-operations lists generation and legacy-import operations with a kind discriminator. Bank/item discovery stays in Content/QTI.

Alternatives rejected.
  • Collection per status or job kind
  • AlphaTest item/bank browsing catalog

Rationale. One list primitive without duplicating upstream discovery.

Status: active · Outcome: SHIP · Date: 2026-07-16 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-017ACTIVE · SHIP

Project the verified adaptive pool into immutable evidence

Chosen. QTI owns the adaptive pool root and authoritative ordered member identities; Content owns each imported item's KC relationships. For each ordered QTI member, Bank reconciles its native immutable QTI identity to the Content contentId, then reads GET .../items/{contentId}/kc-tags and requires exactly one primary relationship whose knowledgeComponentGuid equals the generated blueprint slot (with owner-published weight/confidence retained). Bank MUST NOT require caseStandardGuids or knowledgeComponentGuids on QTI item refs, infer KC from titles, or add KC metadata to QTI. Missing, duplicate-primary, mismatched, or unreconciled Content KC proof fails closed. Exact immutable operation bop_3BZPK6BKJ91MS9RP4VXRAYR7KG is the regression shape: conformance must preserve root 66338a93-fe08-4f1a-80f5-39c51032b2dc and its six-member QTI order, obtain KC proof from Content, and reach ready, assignable:true, non-null stable adaptivePool, zero gaps, and sanitized QTI/Content/KC-owner receipts. Public qti_adaptive_selection admission and the stable alias remain unchanged until that positive mode receipt is explicitly published; repeat reads must preserve the canonical manifest hash and strong ETag.

Alternatives rejected.
  • Require KC GUIDs on QTI refs
  • Infer KC from titles or slot position
  • Copy Content KC tags into QTI metadata
  • Accept missing, duplicate, or mismatched primary KC proof
  • Publish adaptive admission before its receipt

Rationale. The reconciliation joins two real owners without moving either boundary: QTI proves selection order, and Content proves the diagnostic KC relationship.

Owning sources. source contract · source contract · source contract

Status: active · Outcome: SHIP · Date: 2026-07-20 · Author: alphatest-triage+2026-07-20-006 · supersedes: none · superseded_by: none

BANK-ITD-026ACTIVE · SHIP

Reject diagnostically empty distractors

Chosen. For every selected-response item, slot verification requires every incorrect response choice to carry a non-empty Incept-authored named misconception tag, requires each tag to be distinct from the correct response and traceable to the generated source artifact, and preserves the choice-to-misconception mapping through deterministic QTI conversion and Content/QTI read-back evidence. An untagged, dead, duplicated, or answer-key-conflicting distractor fails the slot and quarantines the item; Bank never invents or repairs misconception labels locally. Non-selected-response interactions record distractor verification as not_applicable with their interaction type rather than fabricating distractors.

Alternatives rejected.
  • Check only standard, DOK, interaction type, and answer-key correctness
  • Allow generic wrong_answer labels or locally generated misconception tags
  • Require distractors for interaction types that do not contain response choices

Rationale. The module promises diagnostic information from every wrong selected response; making the mapping a per-slot admission predicate prevents structurally valid but diagnostically empty items from entering a bank.

Status: active · Outcome: SHIP · Date: 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: none

BANK-ITD-027ACTIVE · SHIP

Regenerate and rotate weak items without rewriting history

Chosen. A reports-owned revision order naming a weak item and reason (non-discriminating, dead or untagged distractor, or miskeyed) starts a new idempotent Bank regeneration operation that requests a replacement from Incept for the same blueprint slot, runs the complete slot, misconception, QTI-conversion, scoring, and owner-read verification chain, and only then rotates the new immutable QTI artifactVersionId into Content-owned bank membership with provenance linking revisionOrderId, replacedArtifactVersionId, replacementArtifactVersionId, Incept generationRunId, and effectiveAt. The prior artifact remains owner-retained for audit and in-flight administrations; failed replacement verification leaves membership unchanged. Bank never edits the old item, authors a replacement locally, or recomputes Reports analytics.

Alternatives rejected.
  • Patch the weak QTI item in place
  • Generate a local replacement without Incept
  • Rotate membership before the replacement passes full verification
  • Delete the prior artifact or re-score historical attempts

Rationale. An append-only verified rotation closes the Reports-to-Bank improvement loop without violating upstream ownership, auditability, or active-test stability.

Owning sources. source contract

Status: active · Outcome: SHIP · Date: 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: none

Superseded decision lineage

These stable tombstones preserve every ID cited by an active decision. The current repository no longer contains the full superseded prose, so the registry records only recoverable lineage rather than fabricating historical text.

BANK-ITD-019SUPERSEDED · AUDIT TOMBSTONE

Retained decision lineage

Prior Incept binding retained as an audit tombstone; the active decision replaced its inferred request contract with owner-published manifest schema v1.

Status: superseded · Date: retained 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: BANK-ITD-011

BANK-ITD-022SUPERSEDED · AUDIT TOMBSTONE

Retained decision lineage

Prior Content registration decision retained as an audit tombstone; the active decision adds owner-authorized identity reconciliation and the authoritative assignability handshake.

Status: superseded · Date: retained 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: BANK-ITD-013

BANK-ITD-023SUPERSEDED · AUDIT TOMBSTONE

Retained decision lineage

Initial legacy-import decision retained as an audit tombstone; BANK-ITD-010 added governed all-17 owner reads but still authorized Content registration.

Status: superseded · Date: retained 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: BANK-ITD-010

BANK-ITD-010SUPERSEDED · AUDIT TOMBSTONE

Retained decision lineage

Prior legacy-import decision retained as an audit tombstone; it required registering and reading Content membership, which triage decision 2026-07-24-007 replaced with alias proof, bankId:null, ownerMutationCount:0, and assignable:false.

Status: superseded · Date: retained 2026-07-24 · Author: alphatest-loop · supersedes: BANK-ITD-023 · superseded_by: BANK-ITD-028

BANK-ITD-025SUPERSEDED · AUDIT TOMBSTONE

Retained decision lineage

Prior release-gate decision retained as an audit tombstone; the active decision uses capability-specific current-deployment receipts and the shared Bank→Administration assignability predicate.

Status: superseded · Date: retained 2026-07-24 · Author: alphatest-loop · supersedes: none · superseded_by: BANK-ITD-016

Source contracts and accepted owner evidence

Recorded through 2026-07-24 in source-probes.json. The ledger distinguishes fetched contract reachability from accepted triage evidence and owner certification. Contract reachability alone never opens a mode.