Documentation
Plan

45 of 187 pages

AI Product Studio

Issue, Share and Verify a Passport

How to get a signed passport, hand it to someone outside your studio, and check one yourself with nothing but the file and the published public keys.

Issue one

You usually do not have to. Approving a release issues a signed passport in the same step. To issue one at another time:

  1. Open the release on the Release plan, or the work package’s Passport tab.
  2. Choose Issue a signed passport. The studio’s owner or an admin can; a lone owner does it alone.
  3. The new version appears in the list of signed passports, with who issued it.
A release can be issued once it has been approved. A work package can be issued at any time.
Each issue is a new version. Nothing overwrites an earlier one. Reopening a release and approving it again issues the next version, and the version the current approval rests on is marked.
If signing fails at approval, the approval stands. The page says no signed passport was issued for it and offers to issue one. Nothing else needs doing again.

What you can download

FileWhat it isGive it to
.dsseThe signed envelope: the passport and its signature togetherAnyone who will verify it. This is the file that matters
.jsonThe exact body that was signed, byte for byteSomeone who wants to read or process the content
.htmlThe same record as a page to read, with the verifier’s answer as it stood when the page was madeSomeone who wants to read it without tools. A saved page cannot check itself again

Share one by link

  1. On the list of signed passports, choose Share… on the version you want. Only the studio’s owner can.
  2. Choose how long the link lasts: 1 to 30 days.
  3. Copy the link. It is shown once; the Studio keeps only a fingerprint of it and cannot show it again.

Whoever holds the link sees that one version, rendered, with the verifier’s answer at the moment they look — so an exception that has run out during the link’s life is shown as expired — and can download the .dsse to check for themselves. Revoke a link at any time from the same place. A studio can have up to 25 live links. Creating and revoking a link is audited; who opened one is not recorded.

A passport names people. It carries the names of those who assessed, decided and granted exceptions, and the GitHub account each published commit was made as. Share it with that in mind.

Verify one, offline

On the list of signed passports, Verify one outside the Studio gives the command and the script. The script needs only Node.js 18 or later — no packages, nothing to install.

  1. Download the published public keys once and keep them:
    curl -fsS https://api.productivityworkbench.com/.well-known/artefact-passport-keys.json -o keys.json
  2. Check the file:
    node verify-passport.mjs passport.dsse --keys keys.json
  3. To ask “may this be deployed to production at this commit?”, name the environment and the commit:
    node verify-passport.mjs passport.dsse --keys keys.json --environment production --digest COMMIT_SHA
Exit statusMeaning
0The signature is valid. With an environment named: nothing is unmet, no exception has run out, and the commit is one the passport covers
1It is not
2The command could not be run

After the keys are downloaded, verification needs no network. Add --json for the full answer. The same check is a public endpoint, POST /verify/passport, which needs no sign-in: the signature is the authentication. And because the file is a standard signed in-toto statement in a DSSE envelope, general-purpose signing tools read it too.

Reading the answer

Valid means one thing: a published key signed exactly these bytes. It says the record is as issued. It does not say the record is clean.
Unmet lists what the record itself says is not in order: a gate not passed, a required item not satisfied or decided on an earlier version, a control that is not satisfied or unknown, a chain that was not intact, and anything the passport could not read when it was issued.
Expired exceptions are judged against today, not the day of issue. An exception in force when the passport was issued stops counting the day it runs out, with no new version needed.
Not counted against you: things simply not recorded yet — no CI, no control mapped, no deployment reported. They are listed as unknowns and do not fail the check.

If you want more than “trust the download”

Each signed passport shows the id of the key that signed it, beside Signed by. Give that id to your verifier out of band and have it accept only that key, rather than whatever the keys address serves on the day. When Productivity Workbench replaces its signing key, the earlier key stays in the published list as retired, so every passport it signed still verifies.

What there is not

There is no public page where a visitor pastes a passport to verify it, and no public log of issued passports. Verification is the script, the endpoint, or your own tools.

All Guardrails, Evidence & Passport documentation

Build v0.3.2 · deployed 2026-10-19T23:52:31Z