docs(e2e): correct the stand-tier trigger and gate model

The doc told readers to dispatch the workflow "with tier: stand", an input
fc15ec8 removed — workflow_dispatch takes none — and claimed the protected
Environment is what stops a fork or mislabeled run from reaching secrets. It is
not: the job's `if` (label name plus a non-fork head, added in 7b1ecfd) skips
before the Environment is ever evaluated. Describe the real two-gate model: the
`if` first, then the Environment for a run that clears it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Sergey Kozyrenko
2026-07-25 04:12:02 +07:00
co-authored by Claude Opus 4.8
parent 551418136b
commit dd5b4e04d5
+9 -8
View File
@@ -133,14 +133,15 @@ Two conventions the gate reserves:
## Stand tier (Tier 3)
Runs the LLM-independent `@stand` smoke against a real deployment. It lives in its
own workflow (`e2e-stand.yml`) so the PR gate never subscribes to `labeled`. Label a
PR `e2e:stand` (or dispatch the workflow with `tier: stand`); the job runs in a
protected `e2e-stand` Environment whose required reviewers approve before any secret
is exposed. That Environment gate — not the job's label condition — is what protects
the secrets, so even a mislabeled or fork-PR run blocks on a human before it can reach
them. The stand's URL and login come from the `E2E_STAND_URL` / `E2E_STAND_USER` /
`E2E_STAND_PASSWORD` secrets (exposed to the tools as `E2E_BASE_URL` / `E2E_USER` /
`E2E_PASSWORD`).
own workflow (`e2e-stand.yml`) so the PR gate never subscribes to `labeled`. Trigger
it by labelling a PR `e2e:stand`, or from **Actions → E2E Stand → Run workflow**
(`workflow_dispatch` takes no inputs). The job's `if` is the first gate: it runs only
for a `workflow_dispatch`, or a labelled PR whose head is **not** a fork — a
mislabeled or fork-PR run skips the job entirely and never reaches the secrets. For a
run that clears that gate, the protected `e2e-stand` Environment is the second gate:
its required reviewers approve before any secret is exposed. The stand's URL and login
come from the `E2E_STAND_URL` / `E2E_STAND_USER` / `E2E_STAND_PASSWORD` secrets
(exposed to the tools as `E2E_BASE_URL` / `E2E_USER` / `E2E_PASSWORD`).
Before the browser specs, a **schema-compat pre-flight**
(`e2e/tools/schema-compat.mjs`) introspects the stand's live GraphQL schema and