Grade 5 coverage proof
The version-pinned manifest covers 9/9 public rows and 20/20 positive cells exactly once, with 20 cells and 52 items preserved.
For the AcmeTest maintainer
Turn a grade, subject, test kind, rigor policy, and standards scope into a native Platform3 Content test_spec. For mastery gates, every public source-test row must map to an equal-or-higher-DOK slot—or creation fails before a blueprint is written.
…/implementation@mastery_gate/api…/implementation@formative/api…/implementation@adaptive_diagnostic/api
A public GET to each exact base is the health probe and returns 200 JSON naming its accepted testKind and ready service status. Append /v1 only for authenticated resource paths. The docs URL and product root are not API bases, and no origin accepts another origin's discriminator.
The preserved Grade 5 demo mastery-gate catalog is ready. Its schema-v6 record pins the exact STAAR and Iowa source identities, nine public tested-standard rows, twenty positive Content KC×DOK cells, and manifest alphatest-public-inventory-bindings-2026-07-24.v2 binds all 9 rows to all 20 cells through 20 unique owner/Content/CASE evidence locators while preserving 20 cells and 52 items. At the mastery origin, an authorized exact-match request returns 202. The formative origin also returns 202 for its released two-standard Grade 5 fixture after live CASE dereference. Authentication is request-scoped: invalid, expired, under-scoped, or wrong-tenant JWTs receive the normal 401/403 response and do not change release state.
The version-pinned manifest covers 9/9 public rows and 20/20 positive cells exactly once, with 20 cells and 52 items preserved.
The published origin accepts mastery_gate; the exact governed request below returns 202. Platform3 tenant onboarding supplies the JWT.
The published formative origin accepts its released two-standard fixture, dereferences CASE live, writes and reads back Content, and returns 202.
The adaptive origin is mounted and auth-enforced. Schema-valid create returns non-retryable 422 adaptive-kc-corpus-not-onboarded before an operation or write; Content-backed reads remain live.
Evidence: ITD-054 released binding manifest · ITD-056 ready catalog and request-scoped auth · binding evidence · origin-by-origin release note · mastery/adaptive wire evidence · formative wire evidence
The base URL below is public and verified. Ask your Platform3 tenant administrator for a short-lived JWT; AlphaTest intentionally has no public mint route. The ready demo request requires 202. A 401 or 403 means the credential failed, and any other response is surfaced before polling.
Requirements: Bash, curl, and jq. The token must contain verified sub, tenantId, role, iat, and exp. Role reviewer or integrator supplies the bounded customer permissions; an optional scope claim may narrow them. Tenant identity comes only from the token.
Copy the published API base exactly. Replace only the token placeholder with the JWT issued through Platform3 tenant onboarding.
export ALPHATEST_BLUEPRINT_URL='https://alphatest-andymontgomery-9773s-projects.vercel.app/blueprint/integrator_api/implementation@mastery_gate/api'
export ALPHATEST_TOKEN='paste-platform3-tenant-jwt-here'
set -euo pipefail
: "${ALPHATEST_BLUEPRINT_URL:?}"
: "${ALPHATEST_TOKEN:?}"
command -v curl >/dev/null && command -v jq >/dev/null
curl --fail-with-body --silent --show-error \
"$ALPHATEST_BLUEPRINT_URL" \
| jq -e '.status=="ready" and .releaseState=="ready"'The source identities are preserved catalog values, not invented fixture IDs. The request is 52 items, 90 minutes, highest required rigor, and binary mastery criteria.
CREATE_BODY="$(jq -n '{
testKind:"mastery_gate",
subject:"Mathematics",
grade:"5",
scope:{sourceAssessments:[
{sourceKey:"staar-math-g5-v2024",
contentTestSpecId:"48ef5339-849a-42e3-b640-5e9bb3321749",
contentVersion:"1",name:"STAAR Grade 5 Mathematics",
jurisdiction:"TX",assessmentVersion:"2024"},
{sourceKey:"iowa-math-g5-l11",
contentTestSpecId:"05567d25-b8bc-4675-ba5c-94bb65acbfdf",
contentVersion:"1",
name:"Iowa Assessments Mathematics Level 11 (Grade 5)",
jurisdiction:"IA",assessmentVersion:"Level 11"}
]},
itemCount:52,timeBudgetMinutes:90,
rigorPolicy:{mode:"highest_required",
interactionTypes:["choiceInteraction","textEntryInteraction"]},
criteria:{type:"binary_mastery",minimumPercent:90,
requiredStandardPercent:80}
}')"
HTTP_STATUS="$(curl --silent --show-error \
-X POST "$ALPHATEST_BLUEPRINT_URL/v1/blueprints" \
-H "Authorization: Bearer $ALPHATEST_TOKEN" \
-H "Idempotency-Key: acmetest-g5-math-$(date -u +%Y%m%dT%H%M%SZ)-$$" \
-H "Content-Type: application/json" \
--data "$CREATE_BODY" \
--dump-header /tmp/alphatest-blueprint-create.headers \
--output /tmp/alphatest-blueprint-create.json \
--write-out '%{http_code}')"
if [ "$HTTP_STATUS" != 202 ]; then
jq '{type,status,detail,request_id,retryable,errors}' \
/tmp/alphatest-blueprint-create.json >&2
exit 1
fiFields: CreateBlueprintRequest · exact serializer fixture · Decision: ITD-043
Never build a root-absolute operation path. Resolve Location: ./operations/{id} against the effective POST URL so the client remains correct at both the module and path-mounted product origins.
LOCATION="$(awk '
tolower($1)=="location:" {gsub("\r","",$2); print $2; exit}
' /tmp/alphatest-blueprint-create.headers)"
POST_URL="$ALPHATEST_BLUEPRINT_URL/v1/blueprints"
OPERATION_URL="$(jq -nr \
--arg base "$POST_URL" --arg ref "$LOCATION" \
'$base | capture("^(?<origin>https?://[^/]+)(?<path>/.*)$") as $u
| ($u.path | split("/") | .[0:-1] | join("/")) as $dir
| $u.origin + $dir + "/" + ($ref | sub("^\\./";""))')"
for ATTEMPT in $(seq 1 150); do
curl --fail-with-body --silent --show-error \
-H "Authorization: Bearer $ALPHATEST_TOKEN" \
--output /tmp/alphatest-blueprint-operation.json \
"$OPERATION_URL"
STATUS="$(jq -er '.status' /tmp/alphatest-blueprint-operation.json)"
case "$STATUS" in
ready)
BLUEPRINT_ID="$(jq -er '.blueprintId' \
/tmp/alphatest-blueprint-operation.json)"
break ;;
failed)
jq '.failure' /tmp/alphatest-blueprint-operation.json >&2
exit 1 ;;
accepted|queued|resolving|persisting) sleep 2 ;;
*) printf 'Unknown operation state: %s\n' "$STATUS" >&2; exit 1 ;;
esac
done
[ -n "${BLUEPRINT_ID:-}" ] || {
printf 'Operation did not finish within 5 minutes\n' >&2
exit 1
}Fields: Operation · Decision: ITD-040 mount-safe references
The blueprint ID is a native, opaque Content test_spec id. Pass it through unchanged. Coverage pagination is complete only when nextCursor is null.
curl --fail-with-body --silent --show-error \
-H "Authorization: Bearer $ALPHATEST_TOKEN" \
"$ALPHATEST_BLUEPRINT_URL/v1/blueprints/$BLUEPRINT_ID" \
| tee /tmp/alphatest-blueprint.json | jq '{
contentTestSpecId,title,subject,grade,status,
passingRule,kcCoverage,itemTypeMix,difficultyConstraints,
minForms,maxItemOverlap,enemyItemRule,
testKind: .passingRule.testKind,
criteria: .passingRule.criteria
}'
CURSOR=""
: > /tmp/alphatest-coverage.ndjson
while :; do
QUERY="page_size=100"
[ -n "$CURSOR" ] && QUERY="$QUERY&cursor=$(jq -rn --arg v "$CURSOR" '$v|@uri')"
curl --fail-with-body --silent --show-error \
-H "Authorization: Bearer $ALPHATEST_TOKEN" \
"$ALPHATEST_BLUEPRINT_URL/v1/blueprints/$BLUEPRINT_ID/coverage?$QUERY" \
> /tmp/alphatest-coverage-page.json
jq -c '.data[]' /tmp/alphatest-coverage-page.json \
>> /tmp/alphatest-coverage.ndjson
CURSOR="$(jq -r '.nextCursor // empty' /tmp/alphatest-coverage-page.json)"
[ -z "$CURSOR" ] && break
done
jq -s '{
rows:length,
uncovered:[.[]|select(.status!="covered")],
sources:(map(.sourceKey)|unique),
lowerDok:[.[]
| select(
(.requiredDok < .contentCellDok) or
((.sourceDok != "unstated") and (.requiredDok < .sourceDok))
)]
}' /tmp/alphatest-coverage.ndjsonFields: BlueprintDetail · CoverageRow · Decision: ITD-004 fail closed
All public inventory rows and positive source cells are bound, mapped, count-preserving, and at equal-or-higher DOK. Content readback matches. Partial coverage never becomes ready.
Read failure, preserve requestId and sanitized upstream traces, and retry only when the failure says it is safe. Never substitute local CASE or Content data.
testKind=mastery_gate requires 1–50 governed, immutable source assessments, highest_required rigor, and binary mastery criteria. Every public row must be covered at equal-or-higher DOK.
Use the formative origin with testKind=formative. Its released Grade 5 fixture targets two owner-released CASE standards, ten items, twenty minutes, a 2/6/2/0 DOK distribution, and an 80-percent per-standard criterion; success is 202 → ready.
Use the adaptive origin for testKind=adaptive_diagnostic. Create success remains deferred: a schema-valid request returns non-retryable 422 adaptive-kc-corpus-not-onboarded before an operation or write. Its documented placeholder GUIDs are not runnable; authenticated Content-backed reads are live.
Every endpoint requires Authorization: Bearer <JWT>. Customer roles reviewer and integrator have bounded blueprint:read and blueprint:write role maxima; optional scopes can only narrow them. The reports-only calibration command instead requires role reports_service plus explicit blueprint:calibration:write.
tenantId is forbidden in URL, query, body, and tenant headers. Cross-tenant and unknown IDs share the same 404 shape. AlphaTest never forwards the caller JWT upstream or accepts a Content credential from the request.
Fields: Authorization header · Decisions: ITD-047 roles · ITD-014 tenant routing
/v1/blueprintsLIVE · MASTERY ONLYCreate exactly one blueprint at the matching kind-scoped origin. Requires Idempotency-Key (1–255 visible ASCII bytes), JSON ≤256 KiB, and customer blueprint:write. Unknown fields and explicit nulls are rejected. Mastery and formative have released 202 success fixtures. Adaptive create is mounted but returns non-retryable 422 adaptive-kc-corpus-not-onboarded before operation creation or writes. A wrong discriminator returns 400 validation-failed, pointer /testKind, code invalid_enum, and a message naming the accepted kind—for example, This deployment accepts testKind mastery_gate.
202 Operation plus relative Location: ./operations/{id}.401/403; they never rewrite release state.409 idempotency-key-reused./v1/operations/{operationId}Poll an opaque same-tenant UUID. Returns 200 Operation or 304 with strong ETag handling. States are accepted, queued, resolving, persisting, ready, and failed; only ready and failed are terminal. Cross-kind, cross-tenant, absent, and expired operation IDs share 404 operation-not-found.
/v1/blueprintsReturns Content-order BlueprintSummary rows and an opaque cursor. Accepted query keys are exactly subject_id, target_grade_id, camelCase modifiedSince, limit (1–100, default 25), and cursor. There is no test_kind, status, sort, scan, or local remembered-ID index.
/v1/blueprints/{contentTestSpecId}Returns BlueprintDetail: the Content item plus the wire-faithful passing_rule projection named passingRule and exactly six other test-spec sidecar fields: kc_coverage, item_type_mix, difficulty_constraints, min_forms, max_item_overlap, and enemy_item_rule. All seven sidecar fields project in camelCase. Read the discriminator at passingRule.testKind and the matching kind-specific variant at passingRule.criteria. Ownerless fields are absent, never synthesized.
Endpoint matrix · Detail fields · ITD-037 wire-faithful reads
/v1/blueprints/{id}/coverageMastery gates only. Accepts page_size and opaque cursor; returns fixed sourceRef order. Every ready row has status=covered, owner provenance, source and target CASE GUIDs, source cell count/DOK, slot DOK, mapping disposition, and one literal 100-percent per-source calibration target. Non-mastery blueprints return 409 coverage-not-applicable.
Endpoint matrix · CoverageRow fields · ITD-054 exhaustive binding
/v1/blueprints/{contentTestSpecId}/calibration-deltasNOT MOUNTEDThis is a pinned future reports-service contract, not a live endpoint. No published origin mounts it today. Current mastery and formative probes return 404 route-not-found; adaptive does not mount it either. When implemented, it will consume an exact-base, next-sequence Reports recommendation and native Results/Analytics evidence references, require Idempotency-Key, role reports_service, and explicit blueprint:calibration:write, and create an immutable Content successor without weakening the 100-percent or coverage proof.
type; record request_idApplication-generated 4xx/5xx responses are RFC 9457 application/problem+json with type, title, status, detail, instance, and request_id. Validation adds errors[]. Retryability is explicit where applicable; do not parse human text. Conditional requests are evaluated at the hosting edge: an exact or weak matching If-None-Match validator, a matching member of a validator list, or * returns 304 with no body; a malformed If-None-Match is ignored and the normal 200 response is returned. Do not send If-Match or If-Unmodified-Since on GET: either can return plain-text 412 PRECONDITION_FAILED before the application runs.
| Signal | Meaning | Client action |
|---|---|---|
401 authentication-required / 403 insufficient-scope | The JWT is absent, invalid, expired, wrong-tenant, or lacks the route permission. | Obtain a conforming tenant credential; authentication failure never changes the ready catalog. |
503 public-inventory-binding-unavailable | A governed catalog revision lacks exhaustive, owner-approved public-row bindings. The preserved Grade 5 v2 manifest does not currently take this branch. | Do not poll or infer bindings. Preserve the release evidence; no operation exists. |
400 validation-failed / invalid_enum | The published mastery origin received adaptive_diagnostic or formative. | Do not retry against this origin. No origin for those kinds is published. |
422 adaptive-kc-corpus-not-onboarded | The live adaptive origin has no released owner-typed CASE KC corpus; it returns this before operation creation or writes. | Do not retry unchanged or substitute local KCs. Authenticated Content-backed reads at that origin remain live. |
404 route-not-found | The calibration-delta command is not mounted at any published origin today. | Do not interpret this as blueprint-not-found or successful calibration support; the command remains future contract only. |
400 validation-failed | Body syntax, a test-kind-conditional variant, an unknown or explicit-null body field, or a request header is invalid. | Fix each RFC 6901 errors[].pointer; use a new idempotency key if body semantics change. |
422 validation-failed | A blueprint-list or coverage query is unknown, repeated, or locally invalid. | Fix each RFC 6901 errors[].pointer; do not retry the unchanged query. |
409 idempotency-key-reused | A key was reused with different canonical bytes. | Restore the exact original request or use a new key for new work. |
503 tenant-binding-unavailable | No valid exact-tenant least-privilege CASE/Content service profile is installed. | Stop; operator repairs provisioning. Never send upstream credentials. |
424 upstream-contract-mismatch | An owner response omitted or contradicted a required contract field. | Stop and preserve request/traces; do not infer or fabricate the field. |
429 rate-limited | The tenant exceeded 120 reads in the trailing 60 seconds. | Wait at least the integer Retry-After seconds. |
503 upstream-unavailable | A required owner or the shared limiter is unavailable. | Retry only when retryable=true, respecting Retry-After. |
412 PRECONDITION_FAILED text/plain at hosting edge | If-Match or If-Unmodified-Since was sent on a GET and rejected before application error handling. | Do not send those headers on GET. Use If-None-Match; matching exact/weak/list/* validators return bodyless 304. |
ProblemDetails fields · complete error catalog · ITD-013 precedence
Frameworks, standards, knowledge components, associations, GUIDs, and revisions. AlphaTest reads them live.
The immutable test_spec, list and detail resources, passing rule, KC coverage, interaction and rigor constraints, and parallel-form policy.
Tenant-scoped operation, idempotency, crosswalk working proof, safe traces, and calibration revision metadata, purged 30 days after terminal state.
Attempts, mastery, outcomes, external scores, calibration evidence, and durable improvement-loop facts. AlphaTest accepts only native references.
Working storage dictionary · ITD-001 systems of record · ITD-016 retention
supersedes.422 adaptive-kc-corpus-not-onboarded before an operation or write. Its Content-backed reads remain live.404 route-not-found.kc_coverage alone cannot replace an owner-approved binding.All pinned decision axes · Release gates and gap detectability
ready, pass the native ID forwardReceive the Content test_spec id and preserve the coverage proof.
Request fixed parallel forms or a released adaptive pool from that native id.
Assign the resulting bank/form through OneRoster and Platform3 QTI.
No translation layer: Content test_spec ids, CASE GUIDs, QTI artifact/session ids, and OneRoster sourcedIds remain native owner identifiers.