From picking the right Purpose and Role, to using the Data Generator, to converting a manual test case to a runnable Playwright spec. Start anywhere that fits your current task.
The two most consequential selectors in the Composer are Purpose and Role. Everything else adjusts the result — these two define it. A wrong Purpose generates the wrong deliverable entirely. A wrong Role applies the wrong mental model to it.
The Purpose selector sets defaults for Role, Output Format, Reasoning Mode, and Coverage. In most cases you only need to pick a Purpose and paste your content; the defaults are calibrated.
The quickest way to pick the right Purpose: what deliverable do I need at the end of this prompt?
| If you need… | Purpose | Tier |
|---|---|---|
| Testable acceptance criteria from a vague Jira ticket | Requirement & Jira | 1 |
| Scenarios / test cases for a feature | Test Case Writing | 1 |
| A structured bug report with a root-cause hypothesis | Bug Reporting & Triage | 1 |
| A GREEN / AMBER / RED QA status update for a PM | Status & Reporting | 1 |
| Synthetic test data (CSV, JSON, SQL, XML, Faker.js) | Data Generator | 1 |
| An exploratory charter applying SFDIPOT / RCRCRC heuristics | Exploratory Testing | 1 |
| A runnable Playwright TypeScript spec from a manual scenario | Automation (Playwright) | 2 |
| API test cases covering status codes, auth, payloads, errors | API Testing | 2 |
| Root cause of intermittent CI failures | Flake Triage | 2 |
| A decision on what to automate from a batch of manual cases | Automation Strategy | 2 |
Tier 1 purposes are daily tasks — ticket analysis, test writing, status updates, data generation, exploratory charters. Start here. Tier 2 purposes are specialist — accessibility audits, security testing, performance analysis, automation code.
The Role selector sets the AI’s default instincts — vocabulary, standards, and what it naturally checks for. Think of it as which lens does this task need?
| Stage | Activity | Role to select |
|---|---|---|
| 0 – Understand | Reading a ticket, asking “what does correct mean?” | QA Analyst / Requirements Tester |
| 1 – Explore | Hands-on testing with no script; surfacing unknowns | Exploratory Tester |
| 2 – Specify | Writing human-readable test cases | Test Case Author / Manual QA |
| 3 – Decide | “Which of these 20 cases should we automate?” | Test Automation Analyst |
| 4 – Automate | Converting a case to a Playwright script | Automation Engineer (Playwright/TS) |
| 5 – Architect | POM, fixtures, CI config, sharding, auth reuse | Senior SDET / Framework Architect |
| 6 – Maintain | Flaky tests, data issues, security, a11y, perf | Specialist roles |
Jumping to Stage 4 (Automation Engineer) when you’re actually at Stage 3 (deciding what to automate) or Stage 0 (figuring out what “correct” means). Use the Automation Strategy purpose before writing any code.
The Role selector is multi-select. The first selected Role sets the primary lens; the second adds an additional instinct to the same output. Only add a second Role when you can name a specific reason.
If you’re adding more than two Roles, you’re trying to solve two distinct problems. Split into two separate prompts instead.
Open Presets ▾ in the left panel header. Loading a preset configures Purpose, Role, Output Format, Reasoning Mode, Coverage, and Guards in one click — you only need to paste your content.
| Preset | Paste into textarea |
|---|---|
| Gherkin from Jira Ticket | The Jira ticket text or AC |
| Bug Report + Root Cause | Steps to reproduce + logs or error output |
| Regression Smoke Checklist | Feature description or existing test plan summary |
| API Test Cases (Column Suite) | Endpoint description, OpenAPI snippet, or API contract |
| Playwright E2E Spec | Manual test case steps |
The Composer’s main textarea is where your raw material goes. What you paste there determines the quality of the output. The Composer assembles the role, XML structure, guards, and formatting instructions around it automatically.
Different purposes need different raw material. Pasting the wrong thing — even well-written input — causes generic or off-target output.
| Purpose | Paste into textarea | Avoid |
|---|---|---|
| Requirement & Jira | The exact Jira ticket text including Description, AC, and comments | Your interpretation — paste the raw text |
| Test Case Writing | Feature description with explicit, measurable acceptance criteria | A vague feature name with no criteria |
| Bug Reporting & Triage | Exact steps to reproduce + stack trace or error message | Only symptoms — include the concrete error evidence |
| Flake Triage | Failing test code + CI failure logs (stack trace, timing, frequency) | Just “this test is intermittent” — logs are the evidence |
| Automation (Playwright) | A single manual test case with numbered steps and expected results | A batch of 10 cases — generate one spec at a time |
Below the main textarea are two optional source fields. Keep evidence separate from the task description.
The Composer wraps these in typed XML blocks so the model treats them as evidence, not as instructions. This is what the assembled prompt looks like internally:
<context>
Role: Bug Reporter / Defect Analyst
Environment: Staging build 4821
</context>
<task>
[Your main textarea content]
</task>
<data>
[Your Logs / Evidence field content]
</data>
<schema>
[Your Schema / API Spec field content]
</schema>
<constraints>
[Output format, guards, reasoning mode, coverage]
</constraints>
If you’re pasting real logs that contain session tokens, customer names, or any actual PII — turn on the Redact / Privacy guard before copying the prompt.
The House-Style Example context field is one of the highest-leverage things you can fill in. Paste one complete example output — a test case, a bug report, a table row — in your team’s preferred format. The model mirrors its structure, columns, and tone exactly.
The Custom Instructions field is a free-text addition appended to the end of the prompt. Use it for situational adjustments that don’t warrant a selector change. Do not use it to change format or output type — use the Output Format selector instead.
TEST-123).admin, dealer, guest. Required for Permission coverage.LEADS — produces IDs like TC-LEADS-001.The Data Generator purpose replaces the standard selector panel with a dedicated data spec panel. When you select it, the Composer locks the Test Data Engineer role and switches to a different interface. This guide walks through each field.
| Format | Use when | Notes |
|---|---|---|
| CSV / TSV | Importing into a tool, spreadsheet, or flat import | Set Encoding to UTF-8 with BOM for Excel |
| JSON | API fixtures, frontend mocks, JS/TS consumer | Financial values emitted as strings |
| SQL INSERT | Seeding a relational database directly | Set SQL Dialect — escaping differs per engine |
| XML | Structured feeds, EDI documents, legacy systems | CDATA used for multi-char content |
| Faker.js Factory (TS) | Version-controlled, repeatable generation in TS | Set a Seed — identical seed = identical records |
The model returns records inline — keep Quantity at or below 50 for reliable output. For larger datasets, generate a Faker.js factory or SQL script and run it yourself.
Constant fields are identical across every record (e.g. tenant_id=1001, region=EU). Varying fields must be unique per record. At least one Varying field is required.
| Type | What the model generates | Example |
|---|---|---|
| RFC 5321-valid; @example.com domain only | j.doe@example.com | |
| UUID | v4 UUID, globally unique within the dataset | a1b2c3d4-… |
| Decimal | Fixed-precision; financial values emitted as strings | "19.99" |
| Date | ISO 8601 date string; future dates capped by default | 2025-03-14 |
| Enum | Drawn from a provided list; distributed across records | active |
Identical seed + identical field configuration = byte-identical output every time. Use when the dataset is used in a regression test, a data migration, or you need team-wide reproducibility.
import { faker } from '@faker-js/faker';
type UserStatus = 'active' | 'trial' | 'expired' | 'locked';
export function buildUser(overrides = {}): User {
return {
id: faker.string.uuid(),
firstName: faker.person.firstName(),
email: faker.internet.email({ provider: 'example.com' }),
status: faker.helpers.arrayElement([
'active', 'trial', 'expired', 'locked'
] as const),
...overrides,
};
}
export function buildUserSeeded(seed: number, overrides = {}): User {
faker.seed(seed);
return buildUser(overrides);
}
The Composer has two automation purposes that work in sequence: Automation Strategy decides what to automate and at which layer, then Automation (Playwright) converts each approved case to runnable TypeScript. Skipping the strategy step is the most common cause of brittle suites.
Paste your list of manual test cases. The prompt produces a decision for each case:
| Frequency | Stability | Decision |
|---|---|---|
| High | High | Automate now |
| High | Low | Stabilise first |
| Low | High | Automate later |
| Low | Low | Keep manual |
Switch Purpose to Automation (Playwright). Paste one manual test case (numbered steps + expected result). The prompt produces a runnable TypeScript spec using Arrange-Act-Assert structure.
getByRole, getByLabel, getByTestId) — never CSS class namestoBeVisible(), toHaveText()) — never waitForTimeout()import { test, expect } from '@playwright/test';
test('dealer adds a vehicle to active inventory', async ({ page }) => {
// Arrange: seed state via API
const apiResponse = await page.request.post('/api/dealers/123/session', {
data: { username: 'qa_dealer@example.com', role: 'dealer_admin' },
});
await expect(apiResponse).toBeOK();
// Act: role/label/testid locators
await page.goto('/inventory');
await page.getByRole('button', { name: 'Add Vehicle' }).click();
await page.getByLabel('VIN').fill('1HGBH41JXMN109186');
await page.getByRole('button', { name: 'Save Vehicle' }).click();
// Assert: web-first auto-retrying assertions
await expect(page.getByRole('alert'))
.toContainText('Vehicle added successfully');
});
| Check | Why |
|---|---|
| Locator names match actual DOM | The model uses names from your input — confirm they’re in the real HTML |
| API seeding endpoints are real paths | The model uses placeholder endpoints — replace with actual routes |
| Run in headed mode first | npx playwright test --headed — watch before adding to CI |
| Each test passes individually | Run with --grep "test name" to confirm no ordering dependency |
Switch the Role to Senior SDET / Framework Architect for questions about Page Object Model structure, typed fixtures, playwright.config.ts projects, auth-state reuse, parallel sharding, or CI integration.