Current implementation status
This table reflects@premai/reticle 0.5.1 and its release source (aec6337 in prem-research/reticle).
The client discovers one CPU module (
SEV-SNP or TDX) and an optional NVIDIA evidence bundle, then calls the corresponding high-level methods. The NVIDIA EAT token can contain multiple detached GPU claims even though module discovery reports only the NVIDIA vendor module.
Prem documentation and deployments target AMD SEV-SNP, Intel TDX, and NVIDIA confidential-computing GPUs. The exact hardware model, firmware, TCB, and policy acceptance decision must come from verified evidence and an explicit policy, not from a model alias.
What verified attestation policy means
A complete policy decision needs four distinct inputs:- Authenticity: the report or token verifies against manufacturer collateral.
- Freshness: the evidence contains the verifier’s nonce.
- Configuration: security-relevant claims meet required TCB, debug, and confidential-mode rules.
- Identity: measured values match a release-specific approved reference set.
mrtd or rtmr measurements) so operators can pin approved release images.
Where Reticle runs
Reticle is the verifier library, not a component that must run on the GPU cluster. The attestation endpoint runs with the confidential runtime to obtain hardware evidence. Reticle runs in the SDK or proxy process and verifies that evidence. The Rust implementation is also published as a WASM package for web, server, and mobile JavaScript environments.How the SDK gates a request
With the defaultattest: true, @premai/api-sdk performs this sequence:
- Builds a Reticle client against
PROXY_URLand authenticates with the Prem API key. - Adds the requested model to the attestation query.
- Calls the high-level
client.attest()method. - Reads an
x-session-idfrom the returned attestation headers. - Sends the encrypted inference request with that session ID.
Attestation error handling
When the attestation gate fails, the SDK throws anAttestationError before the protected inference request is sent. The name is a wrapper, not a verdict: an AttestationError does not always mean attestation itself failed. It can also carry a gateway rejection — for example an invalid API key — that surfaces through the attestation gate. The proper error handling path is to distinguish the two, because they need different responses.
The SDK exports four helpers to inspect and surface these errors:
The two cases behind an AttestationError
- A gateway rejection. The gateway rejected the request before attestation could complete — for example
Authentication token is invalidon a401. This is not an attestation failure; it is an API or auth problem that happens to surface through the attestation gate. The user can act on it (fix the API key, check the quota). - A genuine attestation failure. The attestation exchange itself failed internally. There is no user-actionable message; the SDK logs the full cause chain for debugging.
isGatewayError first. If it is true, surface getGatewayErrorMessage — that is the comprehensive, actionable message. Only when it is false should you treat the error as a genuine attestation failure.
getAttestationErrorMessage resolves the message in this order:
- The gateway rejection body — for example
Authentication token is invalidon a401. This is the message you want to show the user, because it tells them what to fix. - The deliberately exposed message — the SDK’s own message when it is not the generic
An internal error occurred. - The outermost cause — used only for the fully-internal case, where the SDK logs the full cause chain for debugging and returns the first cause as a last resort.
instanceof check. This matters if you drive Reticle directly (for example, through useAttestation in a browser bundle): the error can come from a different Reticle WASM instance than the one the SDK cached, so matching on the error shape keeps the check reliable across instances.
Handle attestation errors in code
The attestation gate runs before the inference request is sent. A gateway rejection means the request never reached the model backend, so you can retry safely once the underlying cause (for example, a corrected API key) is resolved.
Routing and session pinning
Routing has two separate meanings:- Commercial/API routing: the gateway authenticates the API key, applies limits and billing metadata, and selects the service path for the requested alias while handling encrypted content.
- Attestation-linked routing: the attestation response supplies a session ID that the SDK attaches to the encrypted inference request so the platform can associate it with the attested backend path.
Model aliases are not assurance profiles
Model-list and completion types do not includeassurance, attestation, tee, or provider-backed/Reticle-verifiable fields.
- OpenAI-format and direct SDK completions can return a backend-resolved model ID in
response.model. - The Anthropic adapter returns the requested alias in its
modelfield. - Neither response is a substitute for an assurance profile.
Run attestation with Reticle
Reticle is published as@premai/reticle on npm. It runs on Node.js, Bun, Deno, modern browsers, and mobile devices (iOS and Android). It performs module discovery, nonce freshness checks, certificate validation, and OPA policy appraisal.
To run attestation yourself and verify a confidential runtime directly, see the step-by-step Run Attestation guide.
Multi-GPU attestation and load balancing
A single model can be served by several physical GPUs at once, and each GPU produces its own signed attestation token. The client verifies every token in the response: it confirms each signature against NVIDIA’s published keys, checks that the request’s freshness value matches on every token, and requires each GPU to pass its measurement check — that is, the GPU’s measured firmware and configuration match NVIDIA’s reference values. These checks establish that each GPU in the response is genuine, fresh, and running measured firmware. A few things they do not establish are worth calling out:- The exact set of GPUs is not pinned. The client verifies every token it is handed but does not reject an unexpected extra one. Any extra token would still need a valid NVIDIA signature and the current freshness value, which limits the risk, but the response does not prove that these — and only these — GPUs served the request.
- Results are all-or-nothing. Verification either succeeds for the whole set of GPUs or fails; the application does not receive a separate pass or fail for each GPU.
- The serving path is not bound. Nothing in the result proves the request was actually routed to the GPUs that were attested, rather than to other hardware behind the load balancer.
CPU technologies and other processors
AMD SEV-SNP and Intel TDX are confidential-VM technologies with remote-attestation formats and manufacturer collateral that Reticle implements. Other CPUs are not automatically insecure; they are unsupported by this verifier unless there is a corresponding confidential-computing architecture, evidence format, collateral path, and policy implementation. Support for one CPU family is significant because it lets a remote client authenticate hardware evidence and freshness for that family. It does not make all workloads, measurements, or firmware states acceptable without policy checks.GPU technologies
NVIDIA confidential computing is hardware- and firmware-dependent. “Hopper” and “Blackwell” are architecture families, not sufficient policy inputs. A verifier must examine the actual signed token and claims for the deployed SKU and software stack. GPUs without a supported confidential-computing mode and attestation format cannot provide the same remote evidence through Reticle. They may still run inference, but the client cannot transfer NVIDIA confidential-computing claims to them.Audit records
An audit record should contain non-sensitive decision metadata, such as:- request/support ID and time;
- requested alias and resolved model ID when exposed;
- verifier and policy version;
- evidence type, hardware identity fields, and TCB result;
- nonce/freshness result;
- reference-set identifier and measurement result when implemented;
- allow/deny decision and reason.
Known gaps
- Expected CPU measurement comparison is policy-driven: measured values reach the configured OPA policy, but the shipped golden policy leaves reference measurements unpinned by default, so approving a specific release image requires operator-supplied reference values.
- The API does not expose a model assurance profile.
- Each GPU in a multi-GPU response is checked for a valid signature, a matching freshness value, and a passing measurement result. The client does not pin the exact set of GPUs, does not surface a per-GPU pass or fail, and does not prove the request ran on the attested GPUs.
- An open-source CVM base image, open verification of model weights and serving engine code, and a public release-to-measurement mapping are separate requirements.
- Package and runtime version reporting currently disagree for the Confidential Proxy.
These findings apply to the reviewed package and source versions. Changes to Reticle, the SDK, endpoints, or policy require new source and live validation.