---
name: 'step-03e-subagent-performance'
description: 'Subagent: Check test performance (speed, efficiency, parallelization)'
subagent: true
outputFile: '/tmp/tea-test-review-performance-{{timestamp}}.json'
---

# Subagent 3E: Performance Quality Check

## SUBAGENT CONTEXT

This is an **isolated subagent** running in parallel with other quality dimension checks.

**Your task:** Analyze test files for PERFORMANCE violations only.

---

## MANDATORY EXECUTION RULES

- ✅ Check PERFORMANCE only (not other quality dimensions)
- ✅ Output structured JSON to temp file
- ❌ Do NOT check determinism, isolation, maintainability, or coverage

---

## SUBAGENT TASK

### 1. Identify Performance Violations

**HIGH SEVERITY Violations**:

- Tests not parallelizable (using test.describe.serial unnecessarily)
- Slow setup/teardown (creating fresh DB for every test)
- Excessive navigation (reloading pages unnecessarily)
- No fixture reuse (repeating expensive operations)

**MEDIUM SEVERITY Violations**:

- Hard waits >2 seconds (waitForTimeout(5000))
- Inefficient selectors (page.$$ instead of locators)
- Large data sets in tests without pagination
- Missing performance optimizations

**LOW SEVERITY Violations**:

- Could use parallelization (test.describe.configure({ mode: 'parallel' }))
- Minor inefficiencies
- Excessive logging

### 2. Calculate Performance Score

```javascript
const severityWeights = { HIGH: 10, MEDIUM: 5, LOW: 2 };
const totalPenalty = violations.reduce((sum, v) => sum + severityWeights[v.severity], 0);
const score = Math.max(0, 100 - totalPenalty);
```

---

## OUTPUT FORMAT

```json
{
  "dimension": "performance",
  "score": 80,
  "max_score": 100,
  "grade": "B",
  "violations": [
    {
      "file": "tests/e2e/search.spec.ts",
      "line": 10,
      "severity": "HIGH",
      "category": "not-parallelizable",
      "description": "Tests use test.describe.serial unnecessarily - reduces parallel execution",
      "suggestion": "Remove .serial unless tests truly share state",
      "code_snippet": "test.describe.serial('Search tests', () => { ... });"
    },
    {
      "file": "tests/api/bulk-operations.spec.ts",
      "line": 35,
      "severity": "MEDIUM",
      "category": "slow-setup",
      "description": "Test creates 1000 records in setup - very slow",
      "suggestion": "Use smaller data sets or fixture factories",
      "code_snippet": "beforeEach(async () => { for (let i=0; i<1000; i++) { ... } });"
    }
  ],
  "passed_checks": 13,
  "failed_checks": 2,
  "violation_summary": {
    "HIGH": 1,
    "MEDIUM": 1,
    "LOW": 0
  },
  "performance_metrics": {
    "parallelizable_tests": 80,
    "serial_tests": 20,
    "avg_test_duration_estimate": "~2 seconds",
    "slow_tests": ["bulk-operations.spec.ts (>30s)"]
  },
  "recommendations": [
    "Enable parallel mode where possible",
    "Reduce setup data to minimum needed",
    "Use fixtures to share expensive setup across tests",
    "Remove unnecessary .serial constraints"
  ],
  "summary": "Good performance with 2 violations - 80% tests can run in parallel"
}
```

---

## EXIT CONDITION

Subagent completes when JSON output written to temp file.

**Subagent terminates here.**
