Requirement: each gate declares id, capability, persona,
failureMeans, releaseDecision (BLOCK/WARN), mitigation, owner.
Missing fields = hard fail at gate definition time.
| INPUT |
Deterministic test outcomes (pass/fail) Tests annotated with gate metadata (id, capability, decision, owner) |
| OUTPUT |
Immediate release signal (BLOCK or WARN) Human-readable gate contract printed in CI logs |
| DETERMINISM |
Each test encodes its own decision rules No external interpretation required Same failure always produces same decision |
| FAILURE SIGNAL |
Missing contract → hard fail Gate failure → BLOCK or WARN decision emitted No silent or ambiguous failures |
| Decision | Definition | Action |
|---|---|---|
| BLOCK | Capability required for release is not verified. | Stop release. Apply fix/rollback. Re-run gate once after change. |
| WARN | Capability is degraded and mitigation exists. | Release may proceed with recorded mitigation + follow-up work item. |
If mitigation is undefined or not actionable, set decision to BLOCK.
Implementation uses helpers/releaseGate.js to enforce required fields and print failure contracts.
test(
"RW.SMOKE.001 — Login establishes authenticated session",
releaseGate(
{
id: "RW.SMOKE.001",
capability: "Authentication: establish session",
persona: "Registered user",
failureMeans: "Users cannot authenticate; authenticated journeys unavailable",
releaseDecision: "BLOCK",
mitigation: "Rollback auth change; validate /api/users/login and storageState",
owner: "Web + API",
},
["home"],
async ({ home }) => {
await home.open();
await home.expectLoggedInNav();
}
)
); Required field missing = gate definition hard fails (no silent partial gates).
| SMOKE | Fast signal on core flows. Default decision = BLOCK unless mitigation is explicit. |
| REGRESSION | Deeper flows and consistency checks. May include WARN gates when mitigation exists. |
| Ownership | Each gate has an owner. CI log output must route ownership from the contract block. |
export WEB_BASE_URL="http://sut.testlab:3000"
export API_BASE_URL="http://sut.testlab:3001/api"
export RW_USER_EMAIL="rwuser_pw@yourdomain.test"
export RW_USER_PASSWORD="yourpassword" npx playwright test specs/sprint6/Sprint6.release-gates.smoke.spec.js \
--project=auth-chromium --workers=1 --reporter=line npx playwright test specs/sprint6/Sprint6.release-gates.regression.spec.js \
--project=auth-chromium --workers=1 --reporter=line npx playwright test specs/sprint6 \
--project=auth-chromium --workers=1 --reporter=line
Valid projects: auth-chromium, unauth-chromium.
Do not run --project=chromium unless it exists in config.
releaseGate(...).
fixtures/global-setup.js and RW_USER_*.
/api.
Action: confirm API_BASE_URL ends with /api and is reachable.
unauth-chromium or override storageState explicitly.
artifacts:paths.
| UPSTREAM | Sprint 5 — Deterministic state (idempotent, isolated tests) |
| DOWNSTREAM |
Sprint 14 — Failure artifacts (structured evidence) Sprint 15 — Failure classification (triage-report.json) Sprint 17 — Automated release decision (release-gate.json) |
This runbook converts test failures into business decisions. Without this layer, failures are just noise. With it, they become actionable release signals.