Turn a scored attempt into an explainable mastery report.
Pass Platform3 IDs through unchanged. After the declared upstream gates open, AlphaTest will compose live QTI, Results, Content, CASE, OneRoster, Analytics, and mastery-engine facts—so AcmeTest can show a score, the exact gaps, and the evidence without calculating or storing learning facts.
Use the QTI attempt ID you already have, ask for a bounded report view, render the returned state and evidence, and branch on stable problem types. The API never asks your app to join Platform3 products or infer mastery.
Contract preview — production report routes are not released today. The public synthetic contract sandbox is callable now for client wiring, but it contains no tenant data and makes no Platform3 calls. Attempt detail and readiness require Gates C+D; candidate history also requires an authoritative candidate/attempt index; cohort and equivalence require Gates A+D; materialization requires Gates B+C+D. Gate E parks implementation and every later build stage until a signed prerequisite manifest dereferences the applicable A/B/C/D receipts and, for adaptive diagnostics, the production-learner Mastery Engine receipt. The production runtime does not advertise these routes while their release gates are closed. After release, an unavailable required dependency returns typed 503 dependency-unavailable, never an empty or synthetic success. See the release matrix · Read the build-eligibility policy.
Cold integration guide
Make a successful call now; keep production gated.
The sandbox lets you prove response parsing and UI wiring against exact contract fixtures. It is intentionally not a substitute for production auth, tenant isolation, writes, or upstream-call evidence.
CALLABLE NOW · SYNTHETIC
1. Fetch an evidence report
Use the fixed sandbox attempt att_7F3k9. The Authorization header is accepted only so your request code has the production shape; the synthetic sandbox does not validate or inspect it.
The second fixed attempt proves the adaptive-only branch: a mastery-scale score, uncertainty, calibration and scale versions, stopping reason, administered item count, and evidence-backed mastered/not-yet/gap classifications.
Expected:214.6 ± 2.7: gap case_math5_alg_patterns. gate is null because it does not apply; nweaNormsSet is null because this fixture claims no MAP crosswalk. Compare the normative fixture · Diagnostic decision
CLIENT WIRING CHECK
2. Exercise materialize, list, readiness, and equivalence
These fixtures make the exact write request, pagination, and two audit projections callable without implying that Results, Caliper, Analytics, or QTI were contacted. Materialize always returns the same fixed synthetic operation and does not inspect the key or body. Candidate history enforces testKind against its fixture rows: an unmatched kind returns an empty terminal page.
Expected list result:pagination complete: 1 final row. The readiness response is not_ready because the same attempt's gate failed at 0.71 < 0.80. The sandbox only resolves the request shapes listed on its fixture manifest. It does not implement real writes, replay semantics, arbitrary IDs, auth failures, or dependency failures.
Production handoff
Exact post-gate request sequence
Keep these calls disabled until the release matrix names a production API origin and Gate E's signed manifest proves the build was eligible. Unlike the sandbox, these routes must verify the tenant JWT and compose real Platform3 facts.
1
Set the API origin and JWT
Use a signed tenant-scoped Platform JWT. Reads require reports:read; materialization requires reports:write. Tenant routing comes only from tenantId in the verified token.
Add the administration ID, then prepare materialization
After Gates B, C, and D open together, this retry-safe orchestration writes settled components to Results, emits Caliper, reads Results back, and composes the report. The approved body requires both the QTI attempt ID and its AlphaTest administration ID; retain the latter from your assignment flow. Keep the same key for an identical retry. Do not call the path before it is released.
Gates B, C, and D are closed. The route is not released, so no production success or Reports problem response is promised today. Once released, a required upstream outage returns the typed 503 fixture in the reference. The service must never guess a Results mapping, bypass two-tenant proof, or write locally. Contract fixtures · Reopening evidence.
3
Implement the post-Gates-C+D evidence read
After Gates C and D open in one coherent release, view=evidence returns identity, settled score, test-kind detail, standards/KCs, contributing QTI outcomes, source freshness, and explicit omission metadata. Before release, the path has no production contract.
After Gate C, Gate D, and the authoritative candidate/attempt index open together, candidate lists use stable, tenant-bound cursor pagination. Every row must satisfy every supplied server-enforced filter after authorization, including qtiTestId, testKind, status, and modifiedSince; an unmatched filter returns 200 with an empty terminal page. The alias testId is intentionally unsupported and returns the typed unsupported-parameter problem. Send the returned cursor with the same filters, sort, and limit; never decode it. Before release, the path has no production contract.
It keeps calls disabled until the release matrix names a production origin; after release, it uses gate.status or score.value as returned, renders every mastery[] gap with its caseGuid and nested evidence[], exposes sources[] freshness, follows nextCursor unchanged, and branches on problem type—never on message text.
Post-gate recipes
One schema, three test kinds
These normative recipes become populated only after Gates C and D open. The authoritative attempt-to-Results-to-Content composition determines test kind; callers do not select it. One unified runtime returns only the evidence that kind can support.
mastery_gate
Certify, or show the complete gap list
Render the Results-owned pass/fail under the immutable blueprint criteria. A failure includes every gap; missing criteria or coverage evidence is indeterminate, never pass.
Show the RIT-like mastery scale score beside its uncertainty, calibration version, stopping reason, and mastered/not-yet/gap map. Any MAP comparison is a labeled crosswalk—not an NWEA-issued score.
Use the same endpoint for weekly unit tests and quizzes. Formative reports do not claim grade-level certification or external readiness unless their blueprint carries qualifying coverage evidence.
After Gates C and D open together, only complete coverage at equal-or-higher DOK plus satisfied gate criteria can produce projected_pass. Rule gate-implies-readiness version 2 means the attempt's gate must be pass, coverageFraction must equal 1, dokDominance must be satisfied, and qualifying blueprint slots must be nonempty. A failed gate produces not_ready; missing or stale evidence produces indeterminate. Before release, the route is absent.
The endpoint is reserved in architecture; the approved field contract is the embedded ReadinessReport projection. Readiness decision
Parallel forms · Gates A+D
Prove the retake form is equivalent
After Gates A and D open together, inspect coverage/DOK match, sample sizes, method, confidence interval, tolerance, decision, analysis version, and the downloadable audit artifact. Before release, the route is absent. insufficient_evidence remains first-class post-gate.
The server fails closed at every tenant-data boundary.
JWT claims
Required: sub, tenantId, iat, exp, role, and permission scope. Resource claims can narrow student, class, and school access. Production exposes no token-mint endpoint; short-lived reviewer credentials are minted out of band by the deployment pipeline.
After Gates B, C, and D open, an identical materialize retry within 24 hours suppresses writes, preserves operationId, recomposes current Platform3 truth, and returns Idempotent-Replayed: true. Today materialization is not deployed.
{
"type": "https://alphatest-andymontgomery-9773s-projects.vercel.app/reports/integrator_api/data_dictionary/problems/idempotency-conflict",
"title": "Idempotency key conflicts with an earlier request",
"status": 409,
"detail": "Use a new Idempotency-Key for a different request body.",
"instance": "/problems/occurrences/req_Z2d6",
"requestId": "req_Z2d6",
"traceId": "trace_M9p1",
"retryable": false,
"dependency": null,
"fieldErrors": null,
"operationId": "op_93wK"
}
Gap declarations
Unavailable upstreams stay visible
A local substitute that looks correct would violate the product contract. Closed gates keep routes unreleased; after release, transient dependency failures use typed problems.
Gate A
Analytics rollup and equivalence contracts unavailable
The class, school-grade, and form-equivalence routes are reserved but not deployed. Platform3 must publish and verify a production Analytics URL and versioned schema first. Reports never computes aggregates or equivalence privately.
The client-facing materialize request is specified, but the upstream Results test_result_components write/read schema and retry-safe Caliper protocol are not. Materialize remains undeployed; no guessed mapping, local outbox of learning facts, or component table is allowed.
Exact lookup exists; the complete evidence join does not
Platform3 confirms authenticated ?qtiAttemptId= lookup, but its published response still lacks the dereferenceable candidate, administration, QTI session/test/item outcomes, Content test spec, test kind, gate, mastery/KC, and Results components required for a report. Attempt detail, candidate lists, readiness, and materialization therefore remain undeployed—never partial reports or producer-id guesses.
No capability releases until one immutable unified runtime passes the three-kind matrix and two production-signed, disjoint tenant fixtures prove same-tenant success, bidirectional non-enumerating denial, anonymous rejection, and cache/idempotency/trace isolation. An unavailable credential or fixture keeps certification inconclusive and the routes closed.
Specification work can continue, but implementation, surface QC, and integration cannot start until one signed prerequisite manifest dereferences every applicable immutable A/B/C/D receipt. Adaptive diagnostics additionally require production-learner QTI member/KC evidence, acknowledged Results components, and Caliper read-back. Stubs, sandbox payloads, public token mints, and permanent 503s do not open this gate.
Attempts and sessions stay in QTI. Settled outcomes and mastery stay in Results. Cohort rollups stay in Analytics. Blueprints stay in Content, standards in CASE, and rosters in OneRoster. Every response includes source resource IDs, observed times, versions or ETags, and freshness status.
QTIResultsContentCASEOneRosterAnalyticsReports live composition