Authoritative file for all agents, skills, and slash-commands in this repo. Any workflow that conflicts with these constraints must STOP and surface the conflict. Last reviewed: 2026-04-28.
This project automates black-box E2E tests for three external sites owned by a third party (freevpnplanet ecosystem):
| Scenario | Entry URL | Locale | Notes |
|---|---|---|---|
| Sign Up | https://freevpnplanet.com/ | EN | Log In → Sign Up → fill form + payment method → "Get your subscription" → assert payment URL/page is opened correctly |
| Personal VPN (RU) | https://planetconfig.com/ | RU | Pick plan → payment method page → payment page. Repeat for several methods incl. crypto |
| Personal VPN (EN) | https://personal.freevpnplanet.com/ | EN | Pick monthly/yearly plan → payment method page → payment page. Repeat for both methods |
We do not own these sites, do not have access to their backend, and have no OpenAPI spec for them.
- OpenAPI / contract testing is N/A. There is no spec we control.
- The
api-client-from-openapiskill is DISABLED for this project. Do not invoke it, do not run/spec-sync, do not generatetests/api/generated/**. tests-config.jsonhasopenapi.enabled = false. Any tooling that reads this flag must skip OpenAPI work.- The
contract-drift-watchsubagent is DISABLED.
- The Sentry MCP is DISABLED for this project. The sites are not ours, we have no Sentry org for them. Do not call any
mcp__plugin_sentry_sentry__*tool. Do not invokesentry:*skills.
- Every payment-flow test MUST stop at the page where a real payment would be initiated (card form, crypto invoice, Apple Pay sheet, redirect target like
*.stripe.com,*.paddle.com,*.cryptomus.com, etc.). - Tests MUST NEVER submit card data, crypto wallet data, OTP, 3DS, or any final "Pay" action.
- Assertions allowed at the boundary: URL pattern, presence of payment-provider DOM markers, absence of error banners, presence of an
amount/currency/order idelement. Disallowed: clicking final pay buttons, filling card numbers (even Stripe test cards), uploading crypto TX hashes.
- Test emails are synthetic, generated via Faker with
SEED=1234for deterministic runs. - Email domain default =
@yopmail.com(disposable-mail service with valid MX). This is a deliberate amendment from@example.test: the sites under test perform server-side MX-record validation and reject reserved RFC TLDs by routing to a/payment/failed/page (seedocs/ux-findings.md, item B-payment-validation). yopmail accepts any local-part, has no per-user delivery, and is the industry-standard QA convention for third-party signups. - Local parts are clearly synthetic (
firstname.lastname.<sequence>) so they don't collide with real human-readable addresses. - Override the default domain via
SYNTHETIC_EMAIL_DOMAINenv var when a target site requires something else. - Passwords, names, phone numbers — also Faker, same seed.
- Never use real personal data, never reuse a real email, never sign up with a domain we don't own.
- RU specs live in their own
test.describe("…@ru", …)group (or dedicated file/project). - EN specs (Sign Up + personal.freevpnplanet.com) live in their own
test.describe("…@en", …)group. - A single test MUST NOT mix locales. The
@ru/@entags are mandatory and used by Playwright--grep.
All three targets are external and outside our control. In playwright.config.ts:
retries: 2trace: 'on-first-retry'video: 'retain-on-failure'screenshot: 'only-on-failure'(recommended companion)
These values are non-negotiable defaults. Per-project overrides are allowed only to strengthen evidence (e.g. trace: 'on'), never to weaken it.
- Prefer
getByRole/getByLabel/getByTestIdpertests-config.json. Inline CSS/XPath only as last resort, with a TODO and a UX-feedback note in the accompanying Google Doc. - Do not auto-heal or silently retry broken selectors — if the third-party DOM changes, surface it as a finding in the UX/issues doc instead of patching tests opaquely.
- Treat any 4xx/5xx during navigation as a real finding, not a flake. Quarantine with
test.fixme+ ticket reference, do not delete.
The following project-level skills/agents are auto-disabled while this file says so:
api-client-from-openapi→ DISABLEDcontract-drift-watch(subagent) → DISABLED/spec-sync(slash command) → DISABLEDsentry:*(all Sentry skills + MCP) → DISABLEDplaywright-test-author-api→ DISABLED (no API contract to test)release-report-composer→ ALLOWED but must omit contract-drift section
Still active and recommended: playwright-framework-bootstrap, fixture-architect, test-data-factory-builder, config-and-secrets, requirements-to-test-design, gherkin-test-case-author, playwright-test-author-ui, test-code-reviewer, playwright-debug-conductor, flaky-triage, run-analyzer, coverage-gap-analyzer.
- Open
https://freevpnplanet.com/. - Click Log In.
- Click Sign Up.
- Fill all required fields + payment method (synthetic data, no real card).
- Click Get your subscription.
- Assert payment URL is generated and the correct payment page opens. STOP here.
- Open
https://planetconfig.com/. - Pick purchase options, proceed to payment-method selection.
- Pick a payment method, proceed to payment page. STOP.
- Repeat for several payment methods, including cryptocurrency.
- Open
https://personal.freevpnplanet.com/. - Pick plan (monthly or yearly), proceed to payment-method selection.
- Pick a payment method, proceed to payment page. STOP.
- Repeat for both payment methods.
This file is the contract. To change a constraint:
- Open a PR that edits this file only.
- Get explicit user approval in the PR description.
- Then propagate to skills/agents/configs.
Agents/skills MUST re-read this file at the start of any session and abort if asked to violate any §2 rule.