Documentation
Plan

50 of 192 pages

AI Product Studio

A Test Environment for Releases

Approving a release is its promotion to test. The approval tags a release candidate on each of its repositories, with the approver’s own GitHub account, and a generated test workflow deploys it behind the passport check, so whatever runs against the test deployment can report its result before the release goes to production.

What approval does

Once a release is approved and its passport issued, the Studio tags each repository of the release at the commit the approval pinned: rc/REL-12 at the first approval, rc/REL-12.2 at the next, and so on. The tag is made with the approver’s own GitHub account — never the GitHub App and never the connection’s token — and the release page lists it under Release candidate.

A tag is never moved or deleted — nothing is tagged when the branch has moved since approval, and a tag of that name already on the same commit is reused. No GitHub release page is published for a candidate.
An approver with no GitHub connection — still approves. The passport is issued, nothing is tagged, and the Release candidate panel says the test environment was not deployed, and why.
Tag the release candidate as you — while the release is approved, an owner or studio admin can make the tag from that panel with their own connected account. When it cannot be made, the panel says why: no GitHub connection, the passport not issued yet, the branch moved, GitHub refused or did not answer. A candidate that could not be tagged never undoes the approval.
Reopening — withdraws the approval and its candidate and leaves the tag on GitHub and on the release’s record. The next approval tags the next candidate.

The test workflow

Where a part of the repository deploys, Repositories → DevOps → Create offers a test pipeline beside dev and prod. It runs on rc/ tags:

JobWhat it does
build-testBuilds and runs the unit tests
scanScans the candidate by what each part is
report-checksReports the results for the tagged commit, which is the release’s cut: they count at the production promotion
passport-checkVerifies the release’s signed passport for the test environment, enforced by default; the owner can choose warn only in the proposal
deploy-testRuns the check again as its first step, checks the tagged commit is on the default branch, deploys to test and reports the deployment

On GitHub, before the first candidate

  1. Create the test environment (Settings → Environments) with its own secrets and its own cloud identity, scoped to that environment.
  2. Limit its deployments to rc/* tags.
  3. Protect rc/* tags as you protect v* ones, with a tag ruleset, so only the people who approve releases can make them.

The deploy token is the same repository secret, PW_DEPLOY_TOKEN.

A dynamic scan against the test deployment

No dynamic scan is generated. Point your own tool — OWASP ZAP, for example — at the test deployment from a workflow of your own on the same rc/ tag, and report its result as the dast category for the tagged commit, as in Tests and Scans on the Passport. A delivery policy that asks for a dynamic scan at the production promotion, at the release’s cut and always, then finds it when the release is released, and refuses the release until it is there.

What it costs

One run of the test workflow per approval: a build, one scan, the report and the deploy — about what a push to main costs, plus the deploy.

All Guardrails, Evidence & Passport documentation

Build v0.4.0 · deployed 2026-10-30T22:41:12Z