A page that deployed is not necessarily the page that was reviewed. Between the commit that passed CI and the bytes a crawler receives there are at least three places the identity can blur: the deployment the provider promoted, the alias that resolves, and the artifact the edge actually serves. A delivery proof is a small signed claim the deployment makes about itself (“I am deployment dpl_… of project prj_…, built from commit <sha>“) that an independent verifier can recompute from the provider’s own records and compare against what the served response carries. If the header a public request returns does not match the proof the provider says that deployment should carry, the deployment is not what it claims to be.
The public package @hraness/vercel-delivery implements this as a Next.js config wrapper. Wrapping a config with withProductionDeliveryProof causes every production response to carry an X-Hraness-Delivery-Proof header whose value is a deterministic token over the deployment identity, not a signature, but a commitment: the verifier recomputes the same token from Vercel’s own deployment, project, and Git records, and the two must be equal for the delivery to be proven. This page is carrying one right now; the header is on every route of the site, including this lesson, and you can see it with curl -sI https://hraness.com/ | grep -i x-hraness-delivery-proof.
what the proof binds
The token is not a signature over the response body; it is a commitment to the deployment’s identity. The identity has four parts, all of which are environment values Vercel injects at build time: the deployment ID (VERCEL_DEPLOYMENT_ID), the project ID (VERCEL_PROJECT_ID), the Git commit SHA (VERCEL_GIT_COMMIT_SHA), and the registered project name, which the caller supplies so the token is bound to the product, not only the provider’s own identifiers. The proof is v1. followed by a SHA-256 hex digest over a domain-separated concatenation of those four values:
SHA-256( "hraness-production-delivery-proof-v1" || \0 || deploymentId || \0 || projectId || \0 || projectName || \0 || sha )
The versioned \0-separated format matters: the domain separator prevents a digest computed for a different purpose from being replayed as a delivery proof, and the v1. prefix leaves room to change the construction without ambiguity.
fail-closed means exactly that
The wrapper has two modes, and the boundary between them is whether any Vercel identity is present. On a plain local run (VERCEL unset, no deployment, project, or SHA environment) resolveProductionDeliveryProof returns null and the config is passed through unchanged. The moment any of those fields is present, validation activates: a missing deployment ID, project ID, or SHA throws Vercel production delivery proof requires exposed deployment, project, and Git identity and the build fails. The design intent is that a misconfigured deployment cannot ship a half-bound proof; it either proves its full identity or it does not build.
That asymmetry (inert locally, strict on the provider) is deliberate. A local next build should not need provider credentials to succeed, but a deployment that received some of its identity and not the rest is exactly the case a proof exists to catch. Failing the build is the only honest answer, because a deployment that cannot prove itself is not one you want serving traffic.