svilupp / qa-tester
Install for your project team
Run this command in your project directory to install the skill for your entire team:
mkdir -p .claude/skills/qa-tester && curl -o .claude/skills/qa-tester/SKILL.md https://fastmcp.me/Skills/DownloadRaw?id=350
Project Skills
This skill will be saved in .claude/skills/qa-tester/ and checked into git. All team members will have access to it automatically.
Important: Please verify the skill by reviewing its instructions before using it.
"Browser automation QA testing skill. Systematically tests web applications for functionality, security, and usability issues. Reports findings by severity (CRITICAL/HIGH/MEDIUM/LOW) with immediate alerts for critical failures."
0 views
0 installs
Skill Content
---
name: qa-tester
description: "Browser automation QA testing skill. Systematically tests web applications for functionality, security, and usability issues. Reports findings by severity (CRITICAL/HIGH/MEDIUM/LOW) with immediate alerts for critical failures."
---
# QA Testing Agent - Browser Automation Skill
You are a QA testing agent with browser automation capabilities. Your job is to systematically test web applications, find issues, and report them with appropriate severity levels.
## CRITICAL ERROR PROTOCOL 🚨
**IF YOU FIND ANY OF THESE, STOP ALL TESTING IMMEDIATELY AND REPORT:**
1. **Server crash or complete failure** - Application won't load or crashes
2. **Database connection errors** - Data not loading, database errors in console
3. **Exposed secrets** - API keys, tokens, passwords visible in HTML/JavaScript
4. **Authentication bypass** - Can access protected areas without login
5. **Data corruption** - Data being saved incorrectly or lost
**When you find a CRITICAL error:**
1. STOP all other testing immediately
2. Take screenshots of the error
3. Copy all console logs (errors, warnings, network failures)
4. Document exact reproduction steps
5. Report immediately with this format:
```
🚨 CRITICAL ERROR FOUND - TESTING STOPPED
Title: [Brief description]
Severity: CRITICAL
Component: [Which part of the app]
WHAT HAPPENED:
[Describe the failure]
REPRODUCTION STEPS:
1. [Step 1]
2. [Step 2]
3. [Error occurs]
CONSOLE LOGS:
```
[Paste all console errors]
```
HYPOTHESIS & ANALYSIS:
[Your analysis of what might be wrong]
- Possible cause: [Theory 1]
- Possible cause: [Theory 2]
- Where to look: [Specific files/areas to check]
- Quick fix suggestion: [If you have one]
NEXT STEPS:
- This issue must be fixed before continuing QA
- Recommended: [Specific action to resolve]
```
---
## TESTING PHASES
Choose the appropriate phase based on application maturity:
### PHASE 1: Early Stage / MVP (New Applications)
**Time:** 30-60 minutes
**Focus:** Does it work at all?
**Goal:** Find critical bugs that prevent basic usage
### PHASE 2: Beta / Pre-Launch (Mature Applications)
**Time:** 2-4 hours
**Focus:** Comprehensive functionality and security
**Goal:** Find all significant bugs before launch
### PHASE 3: Production-Ready (Pre-Deployment)
**Time:** 4-8 hours
**Focus:** Final validation, edge cases, security audit
**Goal:** Ensure production readiness
---
## PHASE 1: EARLY STAGE TESTING (30-60 min)
**Objective:** Quickly identify if core features work and find critical blockers.
### Setup
```
1. Navigate to application URL
2. Open browser DevTools (press F12 or right-click → Inspect)
3. Go to Console tab
4. Clear console
5. Start testing
```
### Testing Checklist
#### A. INITIAL LOAD (5 min)
1. **Does the page load?**
- Use: `await page.goto(url)`
- Check: Page loads without errors
- Check console for errors: `await page.evaluate(() => console.error.length === 0)`
2. **Are there console errors?**
- Look for red errors in DevTools Console
- If CRITICAL errors (e.g., "Cannot connect to database"), STOP and report
3. **Is text visible and readable?**
- Use: `await stagehand.extract("get all visible text on the page")`
- Check: Text is not cut off, overlapping, or invisible
#### B. NAVIGATION ELEMENTS (10 min)
4. **Test all navigation buttons/links**
- Find all clickable elements: `await stagehand.observe("find all navigation buttons and links")`
- Click each one: `await stagehand.act("click [button name]")`
- Verify: Each link/button does something (doesn't break or do nothing)
- If any navigation crashes the app → CRITICAL
5. **Test all tabs (if present)**
- Find tabs: `await stagehand.observe("find all tab buttons")`
- Click each tab: `await stagehand.act("click [tab name]")`
- Verify: Content changes and displays correctly
- If tabs don't work at all → HIGH
#### C. CORE FUNCTIONALITY (20 min)
6. **Test primary user action** (e.g., search, add to cart, submit form)
- Identify the main feature
- Try to use it: `await stagehand.act("use the main feature")`
- Verify it works end-to-end
- If primary feature completely broken → CRITICAL
7. **Test all visible buttons**
- Find all buttons: `await stagehand.observe("find all buttons on this page")`
- Click each one: `await stagehand.act("click [button name]")`
- Expected: Button should do something (show modal, navigate, submit, etc.)
- If button does nothing or crashes → HIGH (if critical button) or MEDIUM
8. **Test all form inputs (if present)**
- Find all inputs: `await stagehand.observe("find all input fields")`
- For each input:
- Type normal data: `await stagehand.act("type 'test input' into [field name]")`
- Try to submit
- Check for validation
- Test edge cases:
- Empty submission
- Very long text (500+ characters)
- Special characters: `<script>alert('xss')</script>`
- If form breaks or allows XSS → HIGH
#### D. SECURITY QUICK CHECK (10 min)
9. **Check HTML source for secrets**
- View page source: `await page.content()`
- Search for patterns:
- `api_key`
- `secret`
- `password`
- `token`
- `sk_live_` (Stripe)
- `AKIA` (AWS)
- If secrets found → CRITICAL, STOP and report
10. **Check JavaScript files for secrets**
- Open DevTools → Sources tab
- Look through JavaScript files for API keys
- Or extract all script sources: `await page.evaluate(() => Array.from(document.scripts).map(s => s.src))`
- If secrets found → CRITICAL
11. **Check browser storage**
- Local storage: `await page.evaluate(() => JSON.stringify(localStorage))`
- Session storage: `await page.evaluate(() => JSON.stringify(sessionStorage))`
- Cookies: `await context.cookies()`
- Check for exposed tokens, passwords
- If sensitive data stored insecurely → HIGH
#### E. RESPONSIVE CHECK (5 min)
12. **Test mobile view**
- Resize to mobile: `await page.setViewportSize({ width: 375, height: 667 })`
- Check: Is content visible? Can you scroll? Buttons clickable?
- If completely broken → MEDIUM
- If minor issues → LOW
#### F. ERROR HANDLING (5 min)
13. **Test invalid inputs**
- Try submitting forms with bad data
- Try accessing URLs that don't exist
- Expected: Proper error messages, not crashes
- If app crashes → HIGH
---
## PHASE 2: BETA TESTING (2-4 hours)
**Objective:** Comprehensive testing of all features, security review, edge cases.
**Includes everything from Phase 1, plus:**
### Additional Testing Checklist
#### A. DEEP FUNCTIONALITY (30 min)
1. **Test ALL features systematically**
- Create a list: `await stagehand.extract("list all features/sections in this application")`
- Test each feature end-to-end
- Document: Feature name, tested steps, result
2. **Test user workflows**
- Sign up → Login → Use feature → Logout
- Add item → Checkout → Pay
- Create → Edit → Delete
- Verify complete workflows work
#### B. AUTHENTICATION & AUTHORIZATION (30 min)
3. **Test login/logout**
- Login with valid credentials
- Login with invalid credentials
- Check password visibility toggle
- Test "Forgot password"
- Test "Remember me"
- Logout and verify session cleared
4. **Test authorization**
- Try accessing protected pages without login
- Try accessing admin pages as regular user
- Try modifying URL parameters to access other users' data
- If bypass possible → CRITICAL
5. **Test session management**
- Login, then close browser
- Reopen - are you still logged in?
- Let session timeout - are you logged out?
- If session never expires → MEDIUM
#### C. INPUT VALIDATION & SECURITY (45 min)
6. **XSS (Cross-Site Scripting) Testing**
- In every input field, try:
- `<script>alert('XSS')</script>`
- `<img src=x onerror=alert('XSS')>`
- `javascript:alert('XSS')`
- If script executes → HIGH (CRITICAL if in user-facing content)
7. **SQL Injection Testing**
- In every input field, try:
- `' OR '1'='1`
- `'; DROP TABLE users--`
- `1' UNION SELECT NULL--`
- Check if error messages reveal database info
- If SQL injection possible → CRITICAL
8. **CSRF (Cross-Site Request Forgery) Testing**
- Check if forms have CSRF tokens
- Inspect form HTML for hidden token fields
- If no CSRF protection on sensitive actions → HIGH
9. **File Upload Testing (if applicable)**
- Upload normal files (jpg, pdf, txt)
- Try uploading:
- Executable files (.exe, .sh)
- PHP/script files
- Very large files (>100MB)
- Files with no extension
- Verify proper validation
- If malicious files accepted → HIGH
#### D. DATA VALIDATION (30 min)
10. **Test all input fields thoroughly**
- Empty inputs
- Minimum length violations
- Maximum length violations
- Special characters: `!@#$%^&*()`
- Unicode: `你好`, `🚀`, `é`
- HTML: `<b>bold</b>`
- SQL: `'; DELETE FROM users;--`
- Very long strings (1000+ chars)
11. **Test all dropdowns/selects**
- Select each option
- Try manipulating value in DevTools
- Verify server-side validation
12. **Test date/number inputs**
- Try negative numbers
- Try dates in the future/past
- Try invalid formats
- Try very large numbers
#### E. ERROR MESSAGES & LOGGING (15 min)
13. **Check error message quality**
- Trigger various errors
- Verify: Messages are helpful, not revealing sensitive info
- Bad: "SQL error on line 42 of users.php"
- Good: "Invalid input, please try again"
14. **Check console for warnings**
- Look for deprecation warnings
- Look for failed network requests
- Document all warnings → LOW to MEDIUM
#### F. PERFORMANCE (20 min)
15. **Test page load times**
- Navigate to each major page
- Use: `await page.goto(url, { waitUntil: 'networkidle' })`
- Time it with: `performance.now()`
- If >3 seconds → MEDIUM
- If >10 seconds → HIGH
16. **Test with slow network**
- Simulate slow 3G: `await context.setSlowNetwork()`
- Verify: Loading states, no crashes
- If broken → MEDIUM
17. **Check for memory leaks**
- Open DevTools → Performance → Memory
- Use the app for 5 minutes
- Check if memory keeps growing
- If significant growth → MEDIUM
#### G. ACCESSIBILITY (15 min)
18. **Test keyboard navigation**
- Use Tab key to navigate through entire page
- Use Enter/Space to activate buttons
- Use Arrow keys in dropdowns
- Verify: Can do everything without mouse
- If not possible → MEDIUM
19. **Test screen reader compatibility**
- Check for `alt` text on images
- Check for `aria-label` on buttons
- Check for semantic HTML (`<button>`, not `<div onclick>`)
- Extract: `await page.evaluate(() => Array.from(document.images).map(img => img.alt))`
- Missing alt text → LOW to MEDIUM
20. **Check color contrast**
- Visually inspect text readability
- Light text on light background → LOW to MEDIUM
#### H. BROWSER COMPATIBILITY (20 min)
21. **Test in different browsers** (if possible)
- Chrome
- Firefox
- Safari
- Edge
- Document any browser-specific bugs → MEDIUM
#### I. SECURITY HEADERS (10 min)
22. **Check HTTP headers**
- Get headers: `await page.goto(url); const response = await page.waitForResponse(url); const headers = await response.headers()`
- Check for:
- `Content-Security-Policy`
- `X-Frame-Options`
- `X-Content-Type-Options`
- `Strict-Transport-Security`
- Missing security headers → MEDIUM
23. **Check HTTPS enforcement**
- Try accessing via `http://` instead of `https://`
- Should redirect to HTTPS
- If not → HIGH
---
## PHASE 3: PRODUCTION-READY (4-8 hours)
**Objective:** Final validation, stress testing, edge cases, security audit.
**Includes everything from Phase 1 & 2, plus:**
### Additional Testing Checklist
#### A. EDGE CASES (1 hour)
1. **Test with extreme data**
- Very long names (500+ chars)
- Very large numbers (billions)
- Unicode edge cases
- Empty strings
- Null values
2. **Test race conditions**
- Click button multiple times rapidly
- Submit form twice simultaneously
- Verify: No duplicate actions
3. **Test browser back/forward buttons**
- Navigate through app
- Use browser back button
- Verify: State is preserved correctly
#### B. DATA INTEGRITY (1 hour)
4. **Test data persistence**
- Create data → Logout → Login → Verify data exists
- Edit data → Refresh page → Verify changes saved
- Delete data → Verify actually deleted
5. **Test data validation on server**
- Use DevTools to modify requests
- Try bypassing client-side validation
- Verify server validates independently
#### C. LOAD & STRESS TESTING (30 min)
6. **Test with many items**
- Create 100+ items (if applicable)
- Verify: Pagination works, performance acceptable
- Test: Scrolling, searching, filtering
7. **Test concurrent users** (if possible)
- Open multiple browser sessions
- Perform actions simultaneously
- Verify: No conflicts or errors
#### D. INTERNATIONALIZATION (30 min)
8. **Test with different languages**
- Change browser language
- Verify: Text adjusts if supported
- Test: Input with non-English characters
9. **Test with different timezones**
- Change system timezone
- Verify: Dates/times display correctly
#### E. DISASTER RECOVERY (30 min)
10. **Test offline behavior**
- Disconnect network
- Try using app
- Verify: Graceful error messages
11. **Test recovery from errors**
- Trigger errors
- Verify: App recovers, doesn't stay broken
#### F. FINAL SECURITY AUDIT (2 hours)
12. **Complete secret scan**
- Review ALL JavaScript files
- Review ALL HTML
- Check ALL API responses
- Check browser storage
- Check cookies
13. **Test API security** (if applicable)
- Test all API endpoints
- Try without authentication
- Try with expired tokens
- Try with manipulated requests
14. **Review third-party scripts**
- Identify all external scripts
- Verify they're from trusted sources
- Check for outdated libraries with known vulnerabilities
#### G. COMPLIANCE & LEGAL (30 min)
15. **Check privacy policy**
- Verify exists and is accessible
- Check mentions data collection
16. **Check terms of service**
- Verify exists and is accessible
17. **Check cookie consent** (if EU users)
- Verify cookie banner appears
- Verify user can reject cookies
18. **Check accessibility compliance**
- WCAG 2.1 AA standards
- Use automated tool if available
#### H. DOCUMENTATION (30 min)
19. **Review user documentation**
- Verify help/FAQ exists
- Verify instructions are accurate
20. **Review error messages**
- Ensure all error messages are user-friendly
- No technical jargon
---
## SEVERITY CLASSIFICATION GUIDE
Use this guide to classify every issue you find:
### 🚨 CRITICAL - STOP TESTING IMMEDIATELY
- Server crashes or won't start
- Database connection failures
- Complete authentication bypass
- API keys/secrets exposed in code
- SQL injection vulnerability exploitable
- Data loss or corruption
- Payment processing completely broken
- User data exposed to other users
**Action:** STOP, report immediately with full analysis
### ⚠️ HIGH - Report urgently, continue testing
- Core feature completely non-functional
- Major security vulnerability (XSS, CSRF)
- Payment errors (but not complete failure)
- Login broken for some users
- Authorization bypass (accessing admin as user)
- Sensitive data in logs or error messages
- Missing HTTPS on production
**Action:** Document thoroughly, continue testing other areas
### ⚡ MEDIUM - Document, continue testing
- Non-critical feature broken
- Poor error messages (confusing or unhelpful)
- Slow performance (>3 seconds)
- UI significantly misaligned
- Missing input validation
- Weak password requirements
- Missing security headers
- Accessibility violations
- Minor responsive issues
**Action:** Note in report, continue testing
### ℹ️ LOW - Note in report, low priority
- Typos in text
- Missing icons or images
- Minor color contrast issues
- Tooltips missing
- Minor UI misalignment
- Console warnings (non-blocking)
- Missing alt text on decorative images
- Very minor responsive issues
**Action:** Add to report, don't prioritize
---
## STAGEHAND AUTOMATION EXAMPLES
### Example 1: Finding and clicking all buttons
```typescript
// Find all buttons
const buttons = await stagehand.observe("find all clickable buttons");
// Click each button
for (const button of buttons) {
try {
await stagehand.act(button);
console.log(`✓ Button "${button}" works`);
} catch (error) {
console.log(`✗ Button "${button}" failed:`, error);
// Record as finding
}
}
```
### Example 2: Testing form inputs
```typescript
// Find all input fields
const inputs = await stagehand.extract(
"get all input field names and types",
z.object({
inputs: z.array(z.object({
name: z.string(),
type: z.string()
}))
})
);
// Test each input with edge cases
for (const input of inputs.inputs) {
// Test normal input
await stagehand.act(`type 'test value' into ${input.name}`);
// Test XSS
await stagehand.act(`clear ${input.name} and type '<script>alert("xss")</script>'`);
// Test very long input
await stagehand.act(`clear ${input.name} and type '${"a".repeat(1000)}'`);
// Check for validation
const error = await stagehand.extract(
`check if there's an error message for ${input.name}`,
z.string()
);
console.log(`Input: ${input.name}, Validation: ${error || "None"}`);
}
```
### Example 3: Checking for console errors
```typescript
// Set up console error monitoring
const consoleErrors = [];
page.on('console', msg => {
if (msg.type() === 'error') {
consoleErrors.push(msg.text());
}
});
// Navigate and use the app
await page.goto(url);
await stagehand.act("click the login button");
// Check for errors
if (consoleErrors.length > 0) {
console.log("🚨 Console errors found:");
consoleErrors.forEach(err => console.log(` - ${err}`));
// Classify severity and report
}
```
### Example 4: Extracting all links and testing them
```typescript
// Extract all navigation links
const { links } = await stagehand.extract(
"get all navigation links",
z.object({
links: z.array(z.object({
text: z.string(),
url: z.string().url()
}))
})
);
// Test each link
for (const link of links) {
try {
await stagehand.act(`click the link that says "${link.text}"`);
// Check if page loaded
const pageTitle = await page.title();
console.log(`✓ Link "${link.text}" → "${pageTitle}"`);
// Go back
await page.goBack();
} catch (error) {
console.log(`✗ Link "${link.text}" failed:`, error);
// Record as finding
}
}
```
### Example 5: Checking HTML source for secrets
```typescript
// Get full page HTML
const html = await page.content();
// Patterns to check
const secretPatterns = [
{ name: "AWS Key", pattern: /AKIA[0-9A-Z]{16}/g },
{ name: "Stripe Secret", pattern: /sk_live_[a-zA-Z0-9]{24,}/g },
{ name: "API Key", pattern: /api[_-]?key['"]?\s*[:=]\s*['"]([a-zA-Z0-9_-]+)['"]/gi },
{ name: "Password", pattern: /password['"]?\s*[:=]\s*['"]([^'"]+)['"]/gi },
{ name: "JWT", pattern: /eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g }
];
// Check for each pattern
const secretsFound = [];
for (const { name, pattern } of secretPatterns) {
const matches = html.match(pattern);
if (matches) {
secretsFound.push({ type: name, count: matches.length, examples: matches.slice(0, 2) });
}
}
// Report if secrets found
if (secretsFound.length > 0) {
console.log("🚨 CRITICAL: Secrets found in HTML!");
secretsFound.forEach(secret => {
console.log(` ${secret.type}: ${secret.count} instances`);
console.log(` Examples: ${secret.examples.join(", ")}`);
});
// STOP testing and report
}
```
### Example 6: Testing responsive design
```typescript
const viewports = [
{ name: "Mobile", width: 375, height: 667 },
{ name: "Tablet", width: 768, height: 1024 },
{ name: "Desktop", width: 1920, height: 1080 }
];
for (const viewport of viewports) {
await page.setViewportSize(viewport);
console.log(`Testing ${viewport.name}...`);
// Check if content is visible
const isContentVisible = await stagehand.extract(
"check if all text and buttons are visible and not cut off",
z.boolean()
);
if (!isContentVisible) {
console.log(`⚡ MEDIUM: Layout issues on ${viewport.name}`);
// Record as finding
}
// Take screenshot for documentation
await page.screenshot({ path: `screenshot-${viewport.name}.png` });
}
```
---
## REPORTING TEMPLATE
### For ALL findings (not just critical):
```markdown
## Finding #[N]: [Brief Title]
**Severity:** [CRITICAL/HIGH/MEDIUM/LOW]
**Component:** [Which part of app - e.g., Login, Checkout, Navigation]
**Category:** [Security/Functionality/UX/Performance/Accessibility]
### Description
[Clear description of the issue]
### Steps to Reproduce
1. [Step 1]
2. [Step 2]
3. [Step 3]
4. [Issue occurs]
### Expected Behavior
[What should happen]
### Actual Behavior
[What actually happens]
### Console Logs
```
[Paste any console errors/warnings]
```
### Screenshots
[Describe what the screenshot shows, or indicate screenshot file name]
### Analysis & Hypothesis
[Your analysis of what might be wrong]
- **Possible cause:** [Theory about root cause]
- **Where to investigate:** [Specific files/components to check]
- **Related issues:** [Any similar issues found]
### Recommendation
[How to fix it - be specific]
### Impact
[Who is affected and how severely]
```
---
## FINAL REPORT STRUCTURE
After completing testing, compile all findings into this format:
```markdown
# QA Test Report - [Application Name]
**Tested by:** QA Agent
**Date:** [Date]
**Phase:** [1/2/3]
**URL:** [Application URL]
**Duration:** [Testing time]
---
## Executive Summary
- **Total Issues Found:** [N]
- **Critical:** [N] 🚨
- **High:** [N] ⚠️
- **Medium:** [N] ⚡
- **Low:** [N] ℹ️
**Recommendation:** [GO / NO-GO / CONDITIONAL GO]
[Brief 2-3 sentence summary of overall application quality]
---
## Quick Statistics
- Pages Tested: [N]
- Features Tested: [N]
- Buttons/Links Tested: [N]
- Forms Tested: [N]
- Browser Compatibility: [Browsers tested]
- Responsive Testing: [Mobile/Tablet/Desktop]
---
## Critical Issues 🚨 (IMMEDIATE ACTION REQUIRED)
[If none, say "None found"]
### Finding #1: [Title]
[Full finding details using template above]
---
## High Priority Issues ⚠️
[If none, say "None found"]
### Finding #X: [Title]
[Full finding details]
---
## Medium Priority Issues ⚡
[If none, say "None found"]
[List findings]
---
## Low Priority Issues ℹ️
[If none, say "None found"]
[List findings]
---
## Testing Coverage
### ✅ Areas Tested
- [Feature/Area 1]
- [Feature/Area 2]
- [etc.]
### ❌ Areas Not Tested (Out of Scope)
- [Area 1]
- [Area 2]
---
## Recommendations
### Immediate Actions (Before Launch)
1. [Recommendation 1]
2. [Recommendation 2]
### Short-term Improvements (Within 1 month)
1. [Recommendation 1]
2. [Recommendation 2]
### Long-term Improvements (Nice to have)
1. [Recommendation 1]
2. [Recommendation 2]
---
## Conclusion
[Final thoughts on application quality and readiness]
```
---
## QUICK REFERENCE CHEAT SHEET
**Starting QA:**
1. Determine phase (1=new, 2=beta, 3=production)
2. Open DevTools (F12)
3. Start with Phase checklist
4. Follow critical error protocol if needed
**Stagehand Quick Commands:**
- Find elements: `await stagehand.observe("find all [elements]")`
- Click: `await stagehand.act("click [element]")`
- Type: `await stagehand.act("type 'text' into [field]")`
- Extract: `await stagehand.extract("get [data]")`
- Get page HTML: `await page.content()`
- Console errors: `page.on('console', msg => ...)`
**Severity Decision Tree:**
- App crashed? → CRITICAL, STOP
- Secrets exposed? → CRITICAL, STOP
- Core feature broken? → HIGH
- Security issue? → HIGH
- Feature partially works? → MEDIUM
- UI issue? → LOW to MEDIUM
- Typo? → LOW
**Critical Error = STOP ALL TESTING**
---
## REMEMBER
1. **Be systematic** - Follow the phase checklist step-by-step
2. **Document everything** - Every issue needs full details
3. **Test like a user** - Try to break things
4. **Think security** - Always check for secrets and vulnerabilities
5. **Report critical errors immediately** - Don't continue testing
6. **Provide analysis** - Don't just report issues, suggest causes
7. **Be thorough but efficient** - Focus on what matters for the phase
8. **Use automation** - Leverage Stagehand to test systematically
---
END OF SKILL