Validate web delivery against requirement acceptance criteria with E2E and NFR gates. Use when user asks QA to verify whether a feature/scenario is complete (for example REQ-LIB-001), run Playwright after frontend/backend preflight checks, and produce or update docs/qa-report.md with pass/fail coverage and evidence.
Validate the delivered user journey, not merely whether a test command exits successfully. The output is a traceable decision about each FR/AC/NFR item, backed by reproducible commands and artifacts.
apps/web/library-mini-admin-web/e2e/**, the corresponding docs/qa-report/QA-<DOMAIN>-<NNN>.md, and the existing corresponding workflow state when the scenario workflow requires a handoff update.data-testid contracts or product defects to the owning role.Read these before changing a spec or reporting a result:
README.md and AGENTS.md.docs/scenarios/ and its workflow state under docs/workflows/ when present. If a required workflow artifact is absent, record that fact; do not invent its state.docs/requirements/REQ-LIB-001.md. If it is absent or not frozen, stop at a blocked handoff and state what is missing.references/qa-e2e-checklist.md, references/qa-report-template.md, current specs under apps/web/library-mini-admin-web/e2e/, and apps/web/library-mini-admin-web/playwright.config.ts.package.json scripts so commands are taken from the repository rather than guessed.Resolve the requirement, scenario, workflow, and report IDs before execution. Keep the report path exact: docs/qa-report/QA-<DOMAIN>-<NNN>.md.
Build the matrix before writing or editing tests. For every FR, AC, and applicable NFR record:
| Field | Required content |
| --- | --- |
| ID/source | Requirement item and source document/section |
| Risk | Impact, frequency, acceptance importance, and data/state complexity |
| Journey | User-visible Given/When/Then scenario and boundaries |
| Setup | Required identity, mutable data, immutable seed, and setup entry point |
| Verification | UI result, API effect, or other observable evidence |
| Test/evidence | Spec path, command, artifact, or manual observation |
| Status | Pass, Partial, Fail, or Blocked |
Use the requirement's stated behavior as the oracle. Include success, validation/error, permission, empty/loading/timeout, state-transition, and concurrency cases only when required by the requirement, architecture, NFR, or risk assessment. Do not invent expected product behavior.
Prioritize high-risk journeys rather than maximizing test count. A test is not coverage unless its assertion proves the relevant acceptance item. Code inspection alone is not Pass evidence.
Status definitions:
Pass: the required behavior is verified with a reproducible passing check and no unresolved caveat.Partial: only part of the item is verified, or the test passes only after retry/flakiness is observed.Fail: the product or contract contradicts the requirement.Blocked: execution or verification cannot proceed because of a missing artifact, unavailable service, permission, or external dependency.Before adding coverage, read references/playwright-e2e-architecture.md. Apply its boundaries:
test spec -> fixture -> (POM | API/service) -> data
Required isolation decisions:
Page and BrowserContext remain test-isolated. Treat storageState as identity/session state, not permission to share mutable business data.Locator policy:
data-testid and follow the repository's data-testid contract for stable state, rows, containers, toasts, and dynamic content.getByRole, getByLabel, or another user-facing locator so the assertion remains sensitive to that contract.nth() unless no stable alternative exists; document the exception.Run and record both checks before E2E:
lsof -iTCP:8080 -sTCP:LISTEN -n -P
lsof -iTCP:5173 -sTCP:LISTEN -n -P
http://localhost:8080.baseURL, normally http://localhost:5173 locally or http://localhost:4173 in CI.playwright.config.ts: its webServer may start/reuse the frontend, but it does not prove backend readiness.npm run dev, npm run dev:api, or npm run dev:web command, preserve the process/log context, and re-check. Do not kill an unknown listener or silently change ports.If a preflight gate is not ready after the documented start/re-check path, mark affected coverage Blocked with reason Blocked by environment; do not mislabel it as a product failure.
When coverage is missing or weak, edit only the E2E layer within the ownership boundary. Keep tests deterministic and readable:
waitForTimeout, fixed sleeps, fixed database IDs, or assumptions about default sorting.200.If a locator or product behavior is missing, record the exact locator/contract and owning rework target instead of editing product code from QA.
Run in this order, adapting only to repository scripts/configuration:
--project=chromium.--retries=0 when process-level counting must be exact.Chromium is the default browser because it is the primary acceptance target.
Firefox and WebKit are opt-in only when the requirement, changed browser-
dependent behavior, release gate, or a Chromium finding gives a concrete
cross-browser reason. Do not fan every run out to all configured projects.
Preserve HTML reports, traces, screenshots, videos, logs, and test-result
paths that materially support a finding. Before writing evidence to a report
or shared artifact location, redact tokens, passwords, cookies, authorization headers,
and personal data. Keep raw evidence outside the deliverable only when its
storage is secure and authorized. A test that passes only after a retry is
flaky and remains Partial until explained and stabilized.
If the effective Playwright configuration or invocation uses only one worker (workers=1), parallelism has not been verified. Use an explicit multi-worker diagnostic when the environment allows it; otherwise mark the parallelism NFR Partial or Blocked with the reason.
For each failure, classify the first meaningful cause before changing anything:
Product: UI/API behavior violates the requirement.Contract: OpenAPI, DTO, error code, or stable locator contract is inconsistent.Test design: assertion, locator, timing, or abstraction is wrong.Data isolation: shared mutable state, collision, order dependency, or failed cleanup.Environment: service, browser, dependency, port, credentials, or CI limitation.Third-party: sandbox/provider unavailable or returned an uncontrolled result.Use trace/report artifacts, request/response evidence, service logs, and a focused rerun to support the classification. Do not repeatedly rerun without a new hypothesis. Route rework according to AGENTS.md: implementation to FE/BE, contract to SD, design to Archi, and requirement ambiguity to SA.
Use references/qa-report-template.md as the report baseline; keep the repository's docs/templates/qa-report-template.md aligned when it is present. The report must contain:
8080 and 5173/4173;If the corresponding workflow state exists, update its QA stage/loop, latest completed step, current status, blockers, next action, and next-session reading order. Do not create a fictional workflow state just to make the report look complete.
Final communication must include:
8080 and frontend 5173/4173;Pass/Partial/Fail/Blocked;docs/qa-report/QA-<DOMAIN>-<NNN>.md;When this skill or its supporting templates/references change, run the read-only validator:
npm run qa:skill:check
It checks required files, local Markdown links, synchronized report templates, skill-agent decoupling, evidence-redaction policy, and the Playwright worker caveat. It does not replace requirement coverage or E2E execution.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer