Documentation
Plan

50 of 192 pages

AI Product Studio

The Delivery Policy: What Each Promotion of a Release Requires

A delivery policy says what a release must show before it is promoted: to test when it is approved, and to production when it is released. The studio owner sets it in Trust Settings; an Enterprise organisation can set a floor under it; and before a merge, every member can read what it will find. With no policy, nothing is asked.

The two promotions

PromotionWhenWhat happens
TestApprove releaseThe policy is assessed after the DPIA and bill-of-materials checks. A rule not met refuses the approval before anything is written. Otherwise the approval records the assessment and issues the signed passport, with every rule as a required row of its release gate
ProductionReleaseThe policy is assessed again against the commits the approval pinned, with the results read again, so what was reported after approval counts. A rule not met refuses the release before any repository is tagged. Otherwise a new signed passport version is issued, carrying the production assessment, before the first tag; the production pipeline’s passport check verifies that version

A merge is never a promotion: dev is what every merge deploys. Before a merge the policy is a reading, which holds the merge only if the owner turns that on (below). If the version issued at release cannot be signed, nothing is tagged and releasing again assesses again.

Setting it

Open Trust Settings → Delivery policy. For each promotion — Test promotion (release approval) and Production promotion (release) — choose Add a rule and pick from the list below. Only the studio owner changes the policy; everyone else sees it, disabled. Each change is in the studio audit. A delivery policy of the studio’s own is on every Studio plan.

Count results not bound to their workflow run — off by default, so only results bound to their run count (see Tests and Scans on the Passport). Turn it on only where everyone who can edit a workflow in your repositories is trusted with what it reports.
A policy that can no longer be read — after a change to what a policy may hold, a stored policy that no longer reads refuses every promotion rather than asking nothing. Trust Settings says so and offers Clear the stored policy; save it again.

The rules

RuleYou chooseMet when
A test or scan passedWhich category; where (each package’s head or the release’s cut); when (where it applies, or always); for a scan, the highest severity that may remain (medium by default: nothing high or critical)The newest result of that category passed (a test) or completed with nothing above the severity (a scan)
No findingsA scan category; where; at or above which severity; in the whole codebase or in what is new since the last releaseNo finding at or above the severity
Line coverageWhere; at least what percentageLine coverage of the whole codebase is at least that. A report that measured no lines is never counted as full coverage
Coverage of new codeWhere; at least what percentageLine coverage of the lines changed since the base is at least that. A change with no new lines meets it
A separate approver—The person promoting did not start a coding run on, merge, or open the pull request of any package on the release
A change request—The release carries a change request: its system (ServiceNow, Jira or other), its reference and a link, entered on the release page. It is recorded, not checked in the other system
Controls satisfiedUp to ten controls; whether a waiver counts as satisfiedEach control reads satisfied on every package’s passport (or waived, where you allowed it)
An artefact publishedWhich kind of artefactA publish report of that kind, bound to its run, at each repository’s head in the cut
A protected base branch—Each repository’s base branch requires a pull request that nobody can bypass, as the Studio read it from GitHub at approval

The rules your organisation’s policy already has — CI passing, a bill of materials, the approver’s roles, a DPIA for AI-built work — stay where they are and apply as before.

The controls a check evidences

A test or scan passed rule and a no findings rule can name up to ten controls they are evidence for (ISO 27001, SOC 2, NIST SSDF, SLSA or your own), picked in the rule’s editor. A test or scan passed rule that names none evidences the usual controls for its category, such as ISO 27001 A.8.29 for a dependency scan; those defaults are not stored in the policy.

The release’s passport then has controls of its own, taken from its delivery rows as a package’s come from its checklist items. A control reads satisfied only when the rule was met and the promotion’s assessment is in the release’s ledger; not satisfied when the rule was not met; unknown when it could not be read. A rule met on a result not bound to its workflow run (only where the owner counts those) says so on the control. The passport’s schema version is 6.

Each package’s head, or the release’s cut

At each package’s head — what each work package’s own pull request pipeline reported at its approved head. Right for checks every change should pass: unit tests, a secret scan. A package with no code has no head and is not asked.
At the release’s cut — what the last pipeline run on main reported at the commit each repository is released at: the integrated build, including any commit made outside the Studio. Right for what is built from the whole: the container image, the infrastructure, the dependency set that ships, end-to-end tests. A pull request’s result never meets a check at the cut.

A release with no check at the cut has no test or scan that covers the commits it ships from outside the Studio; its passport says when nothing was reported there.

Where a check applies

A check asked where it applies follows what the repository is at that commit, as the Studio reads it from its files: a container image scan where there is a Dockerfile, an infrastructure scan where there is infrastructure code, unit tests, static analysis and a dependency scan where there is code to build, and a secret scan always. Where it does not apply the rule asks nothing there. Whether integration tests, end-to-end tests or a dynamic scan are needed cannot be read from files, so those are asked always. If the repository could not be read, whether a check applies is unknown, and unknown refuses: it is never skipped. A repository too large to read in one request is unknown every time, so ask its checks always.

Your organisation’s rules

An organisation on an Enterprise contract can put delivery rules on its guardrail policy, in the same editor (Organisation → Guardrail Policies). They are a floor. At each promotion they join the studio’s own policy and the strictest of all applies: a rule either names is asked, and where both name one the stricter terms win. Results not bound to their run count only where every policy asking says they may.

On Trust Settings — the organisation’s rules are shown locked, named after the organisation. The studio adds rules of its own beside them.
Each work package answers to the version it was created under, as with every guardrail. A version whose rules can no longer be read refuses the promotion; the way out is the studio owner moving the package onto the organisation’s current version.

Before a merge

A work package’s Ship panel and the Verify page (Pull requests) show the rules each package will be asked at its head — tests and scans, findings and coverage, from both promotions — read at the pull request’s head with the same check the promotions use: what was found (“passed, 412 of 412”; “not reported, so the test promotion will refuse this package”), which promotions ask it, and how to fix it. Anyone in the studio sees it.

Off by default, it is a reading — the merge goes ahead, and the promotion finds what the reading said.
The hold — Trust Settings → Delivery policy at the merge → Hold Approve & merge until the delivery policy’s package checks pass, owner only. With it on, the reading is the first thing Approve & merge says is in the way, and the merge is refused until the rules are met at the head about to merge, read again then. Backing a merge out is never held.

The reading is not recorded as evidence: the promotions decide, and record what they decided.

The status on the pull request — where the policy asks a package-scope rule, GitHub shows productivity-workbench/delivery-policy on the pull request: passing when every rule is met at the head, failing when a result failed, found more than the policy allows or covered too little, and pending when a result was not reported, not bound or could not be read. It is for display only and holds nothing. The hold above is separate. To have GitHub hold the merge on it, the owner can require that status in the branch’s protection on GitHub. Where no package-scope rule is asked, nothing is posted. It is refreshed when the Studio next reads the pull request, not the moment a result is reported.
The Definition of Done assessment — an item that reads the pull request is shown the counts the pipeline reported at its head (tests by outcome, findings by severity, coverage), as numbers and fixed words. It is never shown a report, a finding or a tool’s own wording. The counts are context for the agent, not evidence of their own; the promotions decide on the results.

When a promotion is refused

The release page lists each rule not met, where (the package or the repository) and why. Every member can read it and act on it.

The page saysWhat to do
nothing was reportedAdd the report for that category to the pipeline that runs there: the pull request’s runs for a package’s head, the runs on main for the cut
only results not bound to their workflow run were reportedGive the reporting job permissions: id-token: write and run it again, or the owner counts unbound results
the run failed or did not completeFix what failed and run the pipeline again
finding(s) above what the policy allowsFix or upgrade what the scan found, and scan again. The findings are in the workflow run
(a percentage) is below (the threshold)Add tests, or the owner lowers the threshold
the scan did not report what is new since the last releaseReport new findings against a baseline, or ask the rule of the whole codebase
what the repository is could not be readCheck the repository connection still has read access, and try again
the person promoting worked on one of its packagesSomeone else in the studio promotes it
a pull request … was opened by an account the Studio cannot compare with the person promotingThe person promoting connects GitHub under My Account → Source control
not satisfied: (controls)Meet the controls on the package’s Definition of Ready or Done, or record an exception
the base branch does not require a pull request; or asks for one but can be bypassedIn the branch’s classic protection on GitHub, require a pull request, include administrators and let nobody bypass it, then approve again. A ruleset alone reads as bypassable: its bypass list cannot be read with the connection’s read access
whether the base branch requires a pull request was not readApprove again: a rule added after approval has no reading until then
the reported results could not be read in timeTry again
the stored delivery policy could not be readThe studio owner saves the policy again in Trust Settings

A required check is never waived on the gate: if a pipeline cannot run one, the owner changes the policy, and the change is in the audit.

On the passport

Each rule assessed at a promotion is a required row of the release gate on the passport — “Test promotion: …”, “Production promotion: …” — so every verifier, the pipeline’s passport check included, counts a row not met as unmet with nothing new to install. Each promotion is one entry in the release’s evidence ledger. The rows are built from what was assessed at the time, so tightening the policy later changes no passport already issued.

A studio of one

Nothing here needs two people unless you ask for it. A separate approver does: a studio of one that turns it on cannot promote, and the refusal says why. Leave it off until there is someone else to promote.

All Guardrails, Evidence & Passport documentation

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