qa-strategy
E2E QA strategy — flow-based product testing with disciplined triage, regression detection, and autonomous execution
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
E2E QA strategy — flow-based product testing with disciplined triage, regression detection, and autonomous execution
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Handle cross-platform compatibility including file paths, environment detection, platform-specific dependencies, and testing across Windows, macOS, and Linux. Use when dealing with platform-specific code or OS compatibility.
Use when creating, modifying, debugging, or scaffolding OMP extensions, slash commands, custom tools, event hooks, TUI primitives, ExtensionAPI integrations, .omp/extensions, .omp/commands, .omp/tools, package.json omp.extensions, or OMP lifecycle handlers.
Design Director state machine for `/supi:ui-design`. Drives 9 model-owned phases from scope selection through user review, producing a validated HTML mockup artifact.
Guides the harness-engineering pipeline — turn a codebase into one that resists agentic slop with agent-neutral docs, mechanically enforced architecture, and three runtime guardrails
Gray-area extraction stage — surfaces decisions the user must make before the plan can be authored, without expanding scope
Structured extraction of the user's seed prompt into a typed intake artifact — first stage of the UltraPlan authoring pipeline
| name | qa-strategy |
| description | E2E QA strategy — flow-based product testing with disciplined triage, regression detection, and autonomous execution |
Test the product the way a user uses it. Every test simulates a real user flow — navigating, clicking, filling forms, waiting for responses.
This is NOT unit or integration testing. This pipeline tests complete user journeys through the running application.
| Aspect | Detail |
|---|---|
| Scope | End-to-end Playwright tests against a running app |
| Input | Running app URL, optional prior test results for regression comparison |
| Output | Test files (one flow per file), triage verdicts for every failure, regression report |
| Core rule | Every failure gets a verdict before the next test runs |
| Priority | Critical/High flows first; stop adding flows when context reaches ~80% capacity |
| Independence | Each test is self-contained — no shared state, no execution order dependency |
| Priority | What Breaks | Examples |
|---|---|---|
| Critical | Revenue or access | Login, checkout, payment, signup |
| High | Core product value | Create/edit main entities, dashboard, search |
| Medium | Secondary features | Settings, profile, notifications |
| Low | Polish | Theme toggle, tooltips, animations |
A session that thoroughly tests 5 critical flows beats one that superficially touches 20.
Before writing tests, understand what the product does:
If prior test results exist, compare to detect new, removed, and changed flows.
// GOOD — survives refactoring
page.getByRole('button', { name: 'Submit' })
page.getByLabel('Email')
page.getByText('Welcome back')
page.getByTestId('user-avatar')
// BAD — breaks on any styling change
page.locator('.btn-primary')
page.locator('#submit-btn')
page.locator('div > form > button:nth-child(2)')
// GOOD — waits for something specific
await page.waitForResponse(resp => resp.url().includes('/api/users'));
await expect(page.getByText('Success')).toBeVisible();
await expect(page.getByText('Loading...')).not.toBeVisible();
// BAD — arbitrary delay, flaky by design
await page.waitForTimeout(3000);
// BAD — unreliable for SPAs (sockets stay open; resolves before dynamic content loads)
await page.waitForLoadState('networkidle');
test.describe('Checkout flow', () => {
test('adds item to cart', async ({ page }) => { /* ... */ });
test('fills shipping info', async ({ page }) => { /* ... */ });
test('completes payment', async ({ page }) => { /* ... */ });
test('shows confirmation', async ({ page }) => { /* ... */ });
});
When a test fails, classify it immediately — before running the next test.
| Verdict | Meaning | Action |
|---|---|---|
| Bug | App behavior is wrong | Record as regression. Do not change the test assertion — the test is correct, the app is broken. |
| Stale assertion | App changed intentionally | Update the test to match new behavior. |
| Flaky | Non-deterministic failure (evidence of randomness required) | Fix the locator or wait condition. Re-run once. |
| Test error | Test code itself is wrong | Fix the test code and re-run. |
Error: expect(getByRole('heading', { name: 'Dashboard' })).toBeVisible()
→ Timeout 5000ms exceeded.
→ Call log: waiting for getByRole('heading', { name: 'Dashboard' })
| Step | Finding |
|---|---|
| Read error | Heading "Dashboard" not found after login |
| Check app | Route /dashboard now redirects to /home; heading changed to "Home" |
| Verdict | Stale assertion — intentional redesign |
| Action | Update test: navigate to /home, assert "Home" heading |
A regression is a flow that was passing and now fails.
Regressions are the pipeline's highest-priority output.
For each regression, record:
| Field | Value |
|---|---|
| Flow | Which user flow broke |
| Previous status | Last known passing state |
| Current error | Error message and failing assertion |
| Classification | Real bug or intentional change |
Before finishing, verify every item:
| Check | Pass | Fail |
|---|---|---|
| Every failure has a verdict | ✓ | Failures left unclassified |
| Critical flows tested before lower-priority | ✓ | Random or low-priority-first ordering |
| Regressions recorded with all fields | ✓ | Vague "some tests failed" |
| Tests are independent and resilient | ✓ | Tests depend on execution order or shared state |
| Context spent on high-value flows | ✓ | Low-priority flows tested while critical flows skipped |
| Error states tested (API errors, bad input) | ✓ | Only happy paths covered |
| MUST | MUST NOT |
|---|---|
| Triage every failure before proceeding | Accumulate failures to analyze later |
| Use resilient locators (role, label, text, testid) | Use CSS selectors or DOM position |
| Wait for explicit conditions (element, response) | Use waitForTimeout or networkidle |
| Test what the user sees | Test internal state (stores, localStorage, cookies) |
| Provide evidence before classifying a failure as "flaky" | Classify regressions as flaky without proof of non-determinism |
| Test error states and edge cases | Only test happy paths |