Write, update, or review Dify end-to-end tests under `e2e/` that use Cucumber, Gherkin, and Playwright. Use when the task involves `.feature` files, `features/step-definitions/`, `features/support/`, `DifyWorld`, scenario tags, locator/assertion choices, or E2E testing best practices for this repository.
Use this skill for Dify's repository-level E2E suite in e2e/. Use e2e/AGENTS.md as the canonical guide for local architecture and conventions, then apply Playwright/Cucumber best practices only where they fit the current suite.
.feature files, Cucumber step definitions, DifyWorld, hooks, tags, and E2E review work under e2e/.web/; use frontend-testing instead.api/.e2e/AGENTS.md.feature files under e2e/features/e2e/features/step-definitions/e2e/features/support/hooks.ts and e2e/features/support/world.ts when session lifecycle or shared state matterse2e/scripts/run-cucumber.ts and e2e/cucumber.config.ts when tags or execution flow matterreferences/playwright-best-practices.md only when locator, assertion, isolation, or waiting choices are involved.references/cucumber-best-practices.md only when scenario wording, step granularity, tags, or expression design are involved.e2e/ uses Cucumber for scenarios and Playwright as the browser layer.DifyWorld is the per-scenario context object. Type this as DifyWorld and use async function, not arrow functions.e2e/features/step-definitions/; use common/ only for broadly reusable steps.features/support/hooks.ts:
@unauthenticated: clean browser context@authenticated: readability/selective-run tag only unless implementation changes@fresh: only for e2e:full* flowsDifyWorld architecture unless the task is explicitly about changing that architecture.{string} and {int}.getByRole, getByLabel, getByPlaceholder, getByText, then getByTestId for explicit contracts.expect(...) assertions.waitForTimeout, manual polling, or raw visibility checks when a locator action or retrying assertion already expresses the behavior.pnpm -C e2e check.DifyWorld usage?Lead findings with correctness, flake risk, and architecture drift.