
Performance Testing
- 111 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
performance-testing is a Claude Code skill for testing & qa.
About
performance-testing is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- performance-testing
- Testing & QA
- AI-coding skill
Performance Testing by the numbers
- 111 all-time installs (skills.sh)
- +4 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #967 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill performance-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 111 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with testing & qa tasks.?
Helps with testing & qa tasks.
Who is it for?
Best when you're working on testing & qa and need structured help with performance testing.
Skip if: Teams with no testing & qa needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with testing & qa tasks., or when performance-testing is a claude code skill for testing & qa.
What you get
Structured output aligned to performance-testing: performance-testing, Testing & QA.
Files
Performance Testing
<default_to_action> When testing performance or planning load tests: 1. DEFINE SLOs: p95 response time, throughput, error rate targets 2. IDENTIFY critical paths: revenue flows, high-traffic pages, key APIs 3. CREATE realistic scenarios: user journeys, think time, varied data 4. EXECUTE with monitoring: CPU, memory, DB queries, network 5. ANALYZE bottlenecks and fix before production
Quick Test Type Selection:
- Expected load validation → Load testing
- Find breaking point → Stress testing
- Sudden traffic spike → Spike testing
- Memory leaks, resource exhaustion → Endurance/soak testing
- Horizontal/vertical scaling → Scalability testing
Critical Success Factors:
- Performance is a feature, not an afterthought
- Test early and often, not just before release
- Focus on user-impacting bottlenecks
</default_to_action>
Quick Reference Card
When to Use
- Before major releases
- After infrastructure changes
- Before scaling events (Black Friday)
- When setting SLAs/SLOs
Test Types
| Type | Purpose | When |
|---|---|---|
| Load | Expected traffic | Every release |
| Stress | Beyond capacity | Quarterly |
| Spike | Sudden surge | Before events |
| Endurance | Memory leaks | After code changes |
| Scalability | Scaling validation | Infrastructure changes |
Key Metrics
| Metric | Target | Why |
|---|---|---|
| p95 response | < 200ms | User experience |
| Throughput | 10k req/min | Capacity |
| Error rate | < 0.1% | Reliability |
| CPU | < 70% | Headroom |
| Memory | < 80% | Stability |
Tools
- k6: Modern, JS-based, CI/CD friendly
- JMeter: Enterprise, feature-rich
- Artillery: Simple YAML configs
- Gatling: Scala, great reporting
Agent Coordination
qe-performance-tester: Load test orchestrationqe-quality-analyzer: Results analysisqe-production-intelligence: Production comparison
---
Defining SLOs
Bad: "The system should be fast" Good: "p95 response time < 200ms under 1,000 concurrent users"
export const options = {
thresholds: {
http_req_duration: ['p(95)<200'], // 95% < 200ms
http_req_failed: ['rate<0.01'], // < 1% failures
},
};---
Realistic Scenarios
Bad: Every user hits homepage repeatedly Good: Model actual user behavior
// Realistic distribution
// 40% browse, 30% search, 20% details, 10% checkout
export default function () {
const action = Math.random();
if (action < 0.4) browse();
else if (action < 0.7) search();
else if (action < 0.9) viewProduct();
else checkout();
sleep(randomInt(1, 5)); // Think time
}---
Common Bottlenecks
Database
Symptoms: Slow queries under load, connection pool exhaustion Fixes: Add indexes, optimize N+1 queries, increase pool size, read replicas
N+1 Queries
// BAD: 100 orders = 101 queries
const orders = await Order.findAll();
for (const order of orders) {
const customer = await Customer.findById(order.customerId);
}
// GOOD: 1 query
const orders = await Order.findAll({ include: [Customer] });Synchronous Processing
Problem: Blocking operations in request path (sending email during checkout) Fix: Use message queues, process async, return immediately
Memory Leaks
Detection: Endurance testing, memory profiling Common causes: Event listeners not cleaned, caches without eviction
External Dependencies
Solutions: Aggressive timeouts, circuit breakers, caching, graceful degradation
---
k6 CI/CD Example
// performance-test.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 50 }, // Ramp up
{ duration: '3m', target: 50 }, // Steady
{ duration: '1m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<200'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get('https://api.example.com/products');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 200ms': (r) => r.timings.duration < 200,
});
sleep(1);
}# GitHub Actions
- name: Run k6 test
uses: grafana/k6-action@v0.3.0
with:
filename: performance-test.js---
Analyzing Results
Good Results
Load: 1,000 users | p95: 180ms | Throughput: 5,000 req/s
Error rate: 0.05% | CPU: 65% | Memory: 70%Problems
Load: 1,000 users | p95: 3,500ms ❌ | Throughput: 500 req/s ❌
Error rate: 5% ❌ | CPU: 95% ❌ | Memory: 90% ❌Root Cause Analysis
1. Correlate metrics: When response time spikes, what changes? 2. Check logs: Errors, warnings, slow queries 3. Profile code: Where is time spent? 4. Monitor resources: CPU, memory, disk 5. Trace requests: End-to-end flow
---
Anti-Patterns
| ❌ Anti-Pattern | ✅ Better |
|---|---|
| Testing too late | Test early and often |
| Unrealistic scenarios | Model real user behavior |
| 0 to 1000 users instantly | Ramp up gradually |
| No monitoring during tests | Monitor everything |
| No baseline | Establish and track trends |
| One-time testing | Continuous performance testing |
---
Agent-Assisted Performance Testing
// Comprehensive load test
await Task("Load Test", {
target: 'https://api.example.com',
scenarios: {
checkout: { vus: 100, duration: '5m' },
search: { vus: 200, duration: '5m' },
browse: { vus: 500, duration: '5m' }
},
thresholds: {
'http_req_duration': ['p(95)<200'],
'http_req_failed': ['rate<0.01']
}
}, "qe-performance-tester");
// Bottleneck analysis
await Task("Analyze Bottlenecks", {
testResults: perfTest,
metrics: ['cpu', 'memory', 'db_queries', 'network']
}, "qe-performance-tester");
// CI integration
await Task("CI Performance Gate", {
mode: 'smoke',
duration: '1m',
vus: 10,
failOn: { 'p95_response_time': 300, 'error_rate': 0.01 }
}, "qe-performance-tester");---
Agent Coordination Hints
Memory Namespace
aqe/performance/
├── results/* - Test execution results
├── baselines/* - Performance baselines
├── bottlenecks/* - Identified bottlenecks
└── trends/* - Historical trendsFleet Coordination
const perfFleet = await FleetManager.coordinate({
strategy: 'performance-testing',
agents: [
'qe-performance-tester',
'qe-quality-analyzer',
'qe-production-intelligence',
'qe-deployment-readiness'
],
topology: 'sequential'
});---
Pre-Production Checklist
- [ ] Load test passed (expected traffic)
- [ ] Stress test passed (2-3x expected)
- [ ] Spike test passed (sudden surge)
- [ ] Endurance test passed (24+ hours)
- [ ] Database indexes in place
- [ ] Caching configured
- [ ] Monitoring and alerting set up
- [ ] Performance baseline established
---
Related Skills
- agentic-quality-engineering - Agent coordination
- api-testing-patterns - API performance
- chaos-engineering-resilience - Resilience testing
---
Remember
Performance is a feature: Test it like functionality Test continuously: Not just before launch Monitor production: Synthetic + real user monitoring Fix what matters: Focus on user-impacting bottlenecks Trend over time: Catch degradation early
With Agents: Agents automate load testing, analyze bottlenecks, and compare with production. Use agents to maintain performance at scale.
Run History
After each performance test run, append results to run-history.json in this skill directory:
node -e "
const fs = require('fs');
const h = JSON.parse(fs.readFileSync('.claude/skills/performance-testing/run-history.json'));
h.runs.push({date: new Date().toISOString().split('T')[0], scenario: 'load', p95_ms: P95, throughput_rps: RPS, error_rate_pct: ERR});
fs.writeFileSync('.claude/skills/performance-testing/run-history.json', JSON.stringify(h, null, 2));
"Read run-history.json before each run — compare with baselines. Alert if p95 increases >20% from baseline.
Gotchas
- k6 scripts generated by agent often hardcode base URLs — use environment variables for portability
- Load tests in containers hit resource limits before app limits — ensure container has 2x the resources of target
- Agent forgets to include think time between requests — without it, load is unrealistically bursty
- P95 vs P99 matters — agent defaults to averages which hide tail latency problems
- Baseline comparison requires consistent environment — CI runner variance can cause 20%+ noise
{
"$schema": "./config-schema.json",
"_description": "Performance Testing configuration. Auto-created on first run. Edit to customize.",
"tool": null,
"baseline_file": null,
"thresholds": {
"p95_response_ms": 500,
"error_rate_percent": 1,
"throughput_rps": 100
},
"options": {
"duration": "30s",
"vus": 10,
"rampUp": "10s",
"thinkTime": "1s"
},
"_setupPrompt": "If tool is null, ask: 'Which load testing tool do you use? (k6/artillery/jmeter)'. If baseline_file is null, ask: 'Do you have an existing performance baseline file? (path or \"none\")'."
}
# =============================================================================
# AQE Skill Evaluation Test Suite: Performance Testing v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for the performance-testing skill per ADR-056.
# Tests load testing, stress testing, endurance testing, response time analysis,
# throughput calculation, SLA validation, and bottleneck identification.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/performance-testing/scripts/validate-config.json
#
# Coverage:
# - Load Testing: k6, Artillery, JMeter scenarios
# - Stress Testing: Breaking point identification
# - Endurance Testing: Memory leak detection
# - Response Time Analysis: Percentile calculations (p50, p95, p99)
# - Throughput Analysis: Requests per second, transactions
# - SLA Validation: Threshold compliance checking
# - Bottleneck Identification: CPU, memory, DB, network
#
# =============================================================================
skill: performance-testing
version: 1.0.0
description: >
Comprehensive evaluation suite for the performance-testing skill.
Tests load/stress/endurance testing capabilities, response time percentile
accuracy, throughput calculation, SLA compliance checking, and bottleneck
identification. Supports multi-model testing and integrates with ReasoningBank
for continuous improvement.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
# Query existing performance patterns before running evals
query_patterns: true
# Track each test outcome for learning feedback loop
track_outcomes: true
# Store successful patterns after evals complete
store_patterns: true
# Share learning with fleet coordinator agents
share_learning: true
# Update quality gate with validation metrics
update_quality_gate: true
# Target agents for learning distribution
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- qe-performance-tester
- qe-chaos-engineer
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq # JSON parsing (required)
- bc # Math operations (optional)
environment_variables:
PERF_TEST_MODE: "evaluation"
SLA_STRICT: "true"
PERCENTILE_VALIDATION: "true"
fixtures:
- name: k6_load_test_script
path: fixtures/k6-load-test.js
content: |
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 50 },
{ duration: '3m', target: 50 },
{ duration: '1m', target: 0 },
],
thresholds: {
http_req_duration: ['p(95)<200'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get('https://api.example.com/products');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 200ms': (r) => r.timings.duration < 200,
});
sleep(1);
}
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Load Testing
# ---------------------------------------------------------------------------
- id: tc001_load_test_basic_analysis
description: "Analyze basic load test results with response times and throughput"
category: load-testing
priority: critical
input:
scenario: |
A k6 load test was run against an e-commerce API with 100 virtual users
for 5 minutes. Analyze the results:
- Total Requests: 45,000
- Successful: 44,820
- Failed: 180
- Average Response Time: 145ms
- p50: 120ms
- p95: 280ms
- p99: 450ms
- Requests/second: 150
SLA Thresholds:
- p95 response time < 300ms
- Error rate < 1%
context:
tool: k6
testType: load
environment: staging
expected_output:
must_contain:
- "load test"
- "response time"
- "throughput"
- "150"
- "p95"
must_not_contain:
- "no data"
- "unable to analyze"
must_match_regex:
- "p95.*280|280.*p95"
- "error.*rate|rate.*error"
status: success
finding_count:
min: 1
max: 10
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_load_test_sla_failure
description: "Detect SLA failures in load test results"
category: load-testing
priority: critical
input:
scenario: |
Load test results show SLA violations:
- p95 Response Time: 450ms (threshold: 300ms) - FAILED
- Error Rate: 2.5% (threshold: 1%) - FAILED
- Throughput: 1200 req/s (threshold: 1000) - PASSED
Identify the failures and provide recommendations.
context:
tool: artillery
testType: load
expected_output:
must_contain:
- "SLA"
- "failed"
- "threshold"
- "p95"
- "error rate"
must_not_contain:
- "all thresholds met"
- "passed"
severity_classification: high
finding_count:
min: 2
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Stress Testing
# ---------------------------------------------------------------------------
- id: tc003_stress_test_breaking_point
description: "Identify system breaking point from stress test"
category: stress-testing
priority: critical
input:
scenario: |
Stress test ramped from 100 to 1000 VUs over 30 minutes:
100 VUs: p95=120ms, errors=0.1%
200 VUs: p95=150ms, errors=0.2%
400 VUs: p95=220ms, errors=0.5%
600 VUs: p95=380ms, errors=1.5%
800 VUs: p95=850ms, errors=8%
1000 VUs: p95=2500ms, errors=25%
Identify the breaking point and recommend max capacity.
context:
tool: k6
testType: stress
expected_output:
must_contain:
- "breaking point"
- "400"
- "600"
- "capacity"
- "degradation"
must_match_regex:
- "breaking.*point|point.*breaking"
- "recommend.*[0-9]+.*VU|[0-9]+.*VU.*recommend"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.75
reasoning_quality_min: 0.8
- id: tc004_stress_test_gradual_degradation
description: "Analyze gradual performance degradation pattern"
category: stress-testing
priority: high
input:
scenario: |
Performance degrades gradually under increasing load:
Time 0m: 100 VUs, p95=100ms
Time 5m: 100 VUs, p95=105ms
Time 10m: 100 VUs, p95=120ms
Time 15m: 100 VUs, p95=150ms
Time 20m: 100 VUs, p95=200ms
Time 25m: 100 VUs, p95=280ms
Time 30m: 100 VUs, p95=400ms
Note: Load stayed constant but response time increased.
context:
tool: gatling
testType: stress
expected_output:
must_contain:
- "degradation"
- "memory"
- "leak"
- "resource"
must_not_contain:
- "stable"
- "healthy"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Endurance Testing
# ---------------------------------------------------------------------------
- id: tc005_endurance_test_memory_leak
description: "Detect memory leak in endurance test"
category: endurance-testing
priority: critical
input:
scenario: |
24-hour endurance test with 50 VUs:
Hour 0: Memory=2GB, p95=100ms
Hour 4: Memory=2.5GB, p95=105ms
Hour 8: Memory=3.2GB, p95=115ms
Hour 12: Memory=4.1GB, p95=130ms
Hour 16: Memory=5.2GB, p95=160ms
Hour 20: Memory=6.8GB, p95=220ms
Hour 24: Memory=8.5GB, p95=350ms
Server has 16GB RAM. Response time degraded as memory grew.
context:
tool: jmeter
testType: endurance
expected_output:
must_contain:
- "memory leak"
- "endurance"
- "24 hour"
- "growth"
- "fix"
must_match_regex:
- "memory.*leak|leak.*memory"
- "recommend|fix|solution"
severity_classification: critical
finding_count:
min: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.85
- id: tc006_endurance_test_stable
description: "Verify stable system in endurance test"
category: endurance-testing
priority: high
input:
scenario: |
48-hour soak test with 100 VUs - System remained stable:
- Response time p95: 150ms +/- 10ms throughout
- Memory: 4GB +/- 200MB throughout
- CPU: 45% +/- 5% throughout
- Error rate: 0.05% constant
- No connection pool exhaustion
- No thread leaks detected
All metrics within acceptable variance.
context:
tool: k6
testType: soak
expected_output:
must_contain:
- "stable"
- "soak"
- "48 hour"
- "healthy"
must_not_contain:
- "memory leak"
- "degradation"
- "critical"
status: success
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Response Time Analysis
# ---------------------------------------------------------------------------
- id: tc007_percentile_analysis
description: "Analyze response time percentiles correctly"
category: response-time
priority: critical
input:
scenario: |
Analyze these response time percentiles:
min: 15ms
p50: 85ms
p75: 120ms
p90: 180ms
p95: 250ms
p99: 450ms
p999: 850ms
max: 2500ms
avg: 110ms
stdDev: 95ms
SLA: p95 < 300ms, p99 < 500ms
context:
testType: load
expected_output:
must_contain:
- "p95"
- "p99"
- "percentile"
- "SLA"
- "passed"
must_match_regex:
- "p95.*250|250.*p95"
- "p99.*450|450.*p99"
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc008_response_time_outliers
description: "Identify response time outliers"
category: response-time
priority: high
input:
scenario: |
Response time distribution shows outliers:
p50: 50ms
p95: 100ms
p99: 200ms
max: 15000ms
The max value is 75x the p99. This suggests occasional extreme outliers.
Investigate potential causes.
context:
testType: load
expected_output:
must_contain:
- "outlier"
- "spike"
- "max"
- "investigate"
must_match_regex:
- "15000|15,000|15s"
- "garbage.*collection|timeout|network"
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Throughput Analysis
# ---------------------------------------------------------------------------
- id: tc009_throughput_capacity
description: "Analyze throughput capacity"
category: throughput
priority: high
input:
scenario: |
Throughput analysis:
50 VUs: 500 req/s (10 req/VU/s)
100 VUs: 950 req/s (9.5 req/VU/s)
200 VUs: 1600 req/s (8 req/VU/s)
400 VUs: 2000 req/s (5 req/VU/s)
800 VUs: 2100 req/s (2.6 req/VU/s)
Throughput is plateauing. Calculate max capacity.
context:
tool: k6
testType: scalability
expected_output:
must_contain:
- "throughput"
- "plateau"
- "capacity"
- "bottleneck"
must_match_regex:
- "2[01]00.*req|req.*2[01]00"
- "max.*capacity|capacity.*limit"
validation:
schema_check: true
keyword_match_threshold: 0.75
- id: tc010_throughput_decline
description: "Detect throughput decline under load"
category: throughput
priority: critical
input:
scenario: |
Throughput declines as load increases:
100 VUs: 1500 req/s, p95=100ms
200 VUs: 1400 req/s, p95=180ms
300 VUs: 1200 req/s, p95=350ms
400 VUs: 900 req/s, p95=800ms
Throughput is dropping while response time increases.
This indicates severe resource contention.
context:
testType: stress
expected_output:
must_contain:
- "throughput"
- "decline"
- "contention"
- "resource"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Bottleneck Identification
# ---------------------------------------------------------------------------
- id: tc011_database_bottleneck
description: "Identify database connection pool bottleneck"
category: bottleneck
priority: critical
input:
scenario: |
Load test shows database issues:
- Response time spikes when VUs > 200
- Database connection pool: 20 max
- Active connections at spike: 20 (saturated)
- Connection wait time: 500ms avg
- Query execution time: 10ms avg
Application waits for connections, not query execution.
context:
tool: k6
testType: load
expected_output:
must_contain:
- "connection pool"
- "bottleneck"
- "database"
- "increase"
- "20"
must_match_regex:
- "connection.*pool|pool.*connection"
- "saturat|exhaust"
severity_classification: critical
finding_count:
min: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.85
- id: tc012_cpu_bottleneck
description: "Identify CPU bottleneck"
category: bottleneck
priority: high
input:
scenario: |
Performance test with CPU saturation:
100 VUs:
- CPU: 45%
- Memory: 60%
- p95: 100ms
300 VUs:
- CPU: 85%
- Memory: 65%
- p95: 250ms
500 VUs:
- CPU: 98%
- Memory: 68%
- p95: 800ms
CPU is clearly the constraint.
context:
testType: stress
expected_output:
must_contain:
- "CPU"
- "bottleneck"
- "98%"
- "scale"
must_match_regex:
- "CPU.*bottleneck|bottleneck.*CPU"
- "horizontal|vertical|scale"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.75
- id: tc013_network_bottleneck
description: "Identify network bandwidth bottleneck"
category: bottleneck
priority: high
input:
scenario: |
API returns large JSON responses. Network becomes limiting factor:
- Average response size: 500KB
- Network bandwidth: 1Gbps
- At 200 req/s: 800Mbps used, p95=150ms
- At 250 req/s: 1Gbps saturated, p95=500ms
- At 300 req/s: packet drops, p95=2000ms
Application servers have capacity but network is saturated.
context:
testType: load
expected_output:
must_contain:
- "network"
- "bandwidth"
- "bottleneck"
- "1Gbps"
must_match_regex:
- "network.*bottleneck|bottleneck.*network"
- "bandwidth|compress|reduce.*size"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.7
# ---------------------------------------------------------------------------
# CATEGORY: Negative Tests
# ---------------------------------------------------------------------------
- id: tc014_healthy_system_no_false_positives
description: "Verify healthy system is not flagged with false positives"
category: negative
priority: critical
input:
scenario: |
Production load test results - System is healthy:
- 500 VUs for 30 minutes
- p50: 45ms, p95: 85ms, p99: 120ms
- Throughput: 2,500 req/s (stable)
- Error rate: 0.02%
- CPU: 55%, Memory: 65%
- All SLAs passed
- No bottlenecks detected
- Response times stable throughout
context:
tool: k6
testType: load
environment: production
expected_output:
must_contain:
- "healthy"
- "passed"
- "stable"
must_not_contain:
- "critical"
- "bottleneck"
- "memory leak"
- "degradation"
- "failure"
status: success
finding_count:
max: 3 # Allow informational findings only
validation:
schema_check: true
keyword_match_threshold: 0.6
allow_partial: true
- id: tc015_incomplete_data_handling
description: "Handle incomplete performance data gracefully"
category: negative
priority: high
input:
scenario: |
Partial load test data (test interrupted after 5 minutes):
- Collected 5 minutes of 30 minute planned test
- p95: 200ms (limited sample)
- Total requests: 5,000
- Cannot determine steady-state behavior
Provide analysis with appropriate caveats.
context:
tool: artillery
testType: load
expected_output:
must_contain:
- "incomplete"
- "partial"
- "caveat"
- "limited"
must_not_contain:
- "definitive"
- "conclusive"
status: partial
validation:
schema_check: true
allow_partial: true
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
# Overall pass rate (90% of tests must pass)
pass_rate: 0.9
# Critical tests must ALL pass (100%)
critical_pass_rate: 1.0
# Average reasoning quality score
avg_reasoning_quality: 0.75
# Maximum suite execution time (5 minutes)
max_execution_time_ms: 300000
# Maximum variance between model results (15%)
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "qe-performance-tester"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
Performance Testing: Load testing (k6, Artillery, JMeter), Stress testing
(breaking point, gradual degradation), Endurance testing (memory leaks,
stability), Response time analysis (percentiles p50/p95/p99, outliers),
Throughput analysis (capacity, decline), Bottleneck identification
(database, CPU, network). 15 test cases with 90% pass rate requirement
and 100% critical pass rate.
k6 Load Testing Patterns
Basic Load Test
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 20 }, // ramp up
{ duration: '1m', target: 20 }, // steady state
{ duration: '10s', target: 0 }, // ramp down
],
thresholds: {
http_req_duration: ['p(95)<500'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get(`${__ENV.BASE_URL}/api/endpoint`);
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
sleep(1); // Think time — don't forget!
}Stress Test Pattern
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 200 },
{ duration: '5m', target: 200 },
{ duration: '2m', target: 0 },
],
};Spike Test Pattern
export const options = {
stages: [
{ duration: '10s', target: 10 },
{ duration: '1m', target: 10 },
{ duration: '10s', target: 1000 }, // spike!
{ duration: '3m', target: 1000 },
{ duration: '10s', target: 10 },
],
};Soak Test Pattern
export const options = {
stages: [
{ duration: '5m', target: 50 },
{ duration: '4h', target: 50 }, // long duration
{ duration: '5m', target: 0 },
],
};Tips
- Always include
sleep()for think time - Use
__ENV.BASE_URLnot hardcoded URLs - Set
--out json=results.jsonfor CI comparison - Use
scenariosfor complex user journeys - Watch for connection reuse vs real-world patterns
{
"_description": "Performance testing run history. Append after each test run. Claude reads this to detect performance regressions.",
"_format": "Each entry: {date, scenario, p50_ms, p95_ms, p99_ms, throughput_rps, error_rate_pct, baseline_comparison}",
"_instructions": "After running performance tests, append results here. Compare with baselines. Alert if p95 increases >20% from baseline.",
"runs": []
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://agentic-qe.dev/schemas/performance-testing-output.json",
"title": "AQE Performance Testing Skill Output Schema",
"description": "Schema for performance-testing skill output validation. Extends the base skill-output template with load testing metrics, SLA validation, bottleneck identification, and multi-tool support (k6, Artillery, JMeter, Gatling).",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "performance-testing",
"description": "Must be 'performance-testing'"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$",
"description": "Semantic version of the skill"
},
"timestamp": {
"type": "string",
"type": "string",
"description": "ISO 8601 timestamp of output generation"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"],
"description": "Overall execution status"
},
"trustTier": {
"type": "integer",
"const": 3,
"description": "Trust tier 3 indicates full validation with eval suite"
},
"output": {
"type": "object",
"required": ["summary", "testType", "metrics"],
"properties": {
"summary": {
"type": "string",
"minLength": 50,
"maxLength": 2000,
"description": "Human-readable summary of performance test results"
},
"testType": {
"type": "string",
"enum": ["load", "stress", "endurance", "spike", "volume", "scalability", "smoke", "soak"],
"description": "Type of performance test executed"
},
"score": {
"$ref": "#/$defs/performanceScore",
"description": "Overall performance score"
},
"metrics": {
"$ref": "#/$defs/performanceMetrics",
"description": "Core performance metrics including response times and throughput"
},
"slaCompliance": {
"$ref": "#/$defs/slaCompliance",
"description": "SLA/SLO compliance check results"
},
"bottlenecks": {
"type": "array",
"items": {
"$ref": "#/$defs/bottleneck"
},
"maxItems": 50,
"description": "Identified performance bottlenecks"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/performanceFinding"
},
"maxItems": 100,
"description": "Performance issues and observations"
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/performanceRecommendation"
},
"maxItems": 50,
"description": "Optimization recommendations"
},
"scenarios": {
"type": "array",
"items": {
"$ref": "#/$defs/testScenario"
},
"maxItems": 20,
"description": "Individual test scenario results"
},
"resourceUtilization": {
"$ref": "#/$defs/resourceUtilization",
"description": "System resource utilization during test"
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
},
"maxItems": 50,
"description": "Generated reports and data files"
},
"timeline": {
"type": "array",
"items": {
"$ref": "#/$defs/timelineEvent"
},
"description": "Test execution timeline"
},
"testConfiguration": {
"$ref": "#/$defs/testConfiguration",
"description": "Configuration used for the performance test"
},
"comparison": {
"$ref": "#/$defs/performanceComparison",
"description": "Comparison with baseline or previous run"
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"performanceScore": {
"type": "object",
"required": ["value", "max"],
"properties": {
"value": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Performance score (0=critical issues, 100=excellent performance)"
},
"max": {
"type": "number",
"const": 100,
"description": "Maximum score is always 100"
},
"grade": {
"type": "string",
"pattern": "^[A-F][+-]?$",
"description": "Letter grade: A (90-100), B (80-89), C (70-79), D (60-69), F (<60)"
},
"trend": {
"type": "string",
"enum": ["improving", "stable", "declining", "unknown"],
"description": "Trend compared to previous tests"
},
"healthStatus": {
"type": "string",
"enum": ["healthy", "degraded", "critical", "unknown"],
"description": "Overall system health during test"
}
}
},
"performanceMetrics": {
"type": "object",
"required": ["responseTime", "throughput"],
"properties": {
"responseTime": {
"$ref": "#/$defs/responseTimeMetrics",
"description": "Response time statistics"
},
"throughput": {
"$ref": "#/$defs/throughputMetrics",
"description": "Throughput statistics"
},
"errorRate": {
"$ref": "#/$defs/errorRateMetrics",
"description": "Error rate statistics"
},
"concurrency": {
"$ref": "#/$defs/concurrencyMetrics",
"description": "Concurrency and virtual user metrics"
},
"dataTransfer": {
"$ref": "#/$defs/dataTransferMetrics",
"description": "Data transfer metrics"
},
"custom": {
"type": "object",
"additionalProperties": {
"oneOf": [
{ "type": "number" },
{ "type": "string" },
{ "type": "boolean" }
]
},
"description": "Custom metrics specific to the test"
}
}
},
"responseTimeMetrics": {
"type": "object",
"properties": {
"min": {
"type": "number",
"minimum": 0,
"description": "Minimum response time in milliseconds"
},
"max": {
"type": "number",
"minimum": 0,
"description": "Maximum response time in milliseconds"
},
"avg": {
"type": "number",
"minimum": 0,
"description": "Average response time in milliseconds"
},
"median": {
"type": "number",
"minimum": 0,
"description": "Median (p50) response time in milliseconds"
},
"p50": {
"type": "number",
"minimum": 0,
"description": "50th percentile response time in milliseconds"
},
"p75": {
"type": "number",
"minimum": 0,
"description": "75th percentile response time in milliseconds"
},
"p90": {
"type": "number",
"minimum": 0,
"description": "90th percentile response time in milliseconds"
},
"p95": {
"type": "number",
"minimum": 0,
"description": "95th percentile response time in milliseconds"
},
"p99": {
"type": "number",
"minimum": 0,
"description": "99th percentile response time in milliseconds"
},
"p999": {
"type": "number",
"minimum": 0,
"description": "99.9th percentile response time in milliseconds"
},
"stdDev": {
"type": "number",
"minimum": 0,
"description": "Standard deviation of response times"
},
"unit": {
"type": "string",
"enum": ["ms", "s", "us"],
"default": "ms",
"description": "Time unit (milliseconds, seconds, microseconds)"
}
}
},
"throughputMetrics": {
"type": "object",
"properties": {
"requestsPerSecond": {
"type": "number",
"minimum": 0,
"description": "Average requests per second"
},
"peakRequestsPerSecond": {
"type": "number",
"minimum": 0,
"description": "Peak requests per second achieved"
},
"totalRequests": {
"type": "integer",
"minimum": 0,
"description": "Total number of requests made"
},
"successfulRequests": {
"type": "integer",
"minimum": 0,
"description": "Number of successful requests"
},
"failedRequests": {
"type": "integer",
"minimum": 0,
"description": "Number of failed requests"
},
"transactionsPerSecond": {
"type": "number",
"minimum": 0,
"description": "Business transactions per second"
},
"iterationsPerSecond": {
"type": "number",
"minimum": 0,
"description": "Test iterations per second"
}
}
},
"errorRateMetrics": {
"type": "object",
"properties": {
"percentage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Error rate as percentage"
},
"totalErrors": {
"type": "integer",
"minimum": 0,
"description": "Total number of errors"
},
"errorsByType": {
"type": "object",
"additionalProperties": {
"type": "integer"
},
"description": "Error counts by type (e.g., timeout, 5xx, connection)"
},
"errorsByEndpoint": {
"type": "object",
"additionalProperties": {
"type": "integer"
},
"description": "Error counts by endpoint"
}
}
},
"concurrencyMetrics": {
"type": "object",
"properties": {
"virtualUsers": {
"type": "integer",
"minimum": 0,
"description": "Number of virtual users (VUs)"
},
"peakConcurrentUsers": {
"type": "integer",
"minimum": 0,
"description": "Peak concurrent users during test"
},
"avgConcurrentUsers": {
"type": "number",
"minimum": 0,
"description": "Average concurrent users"
},
"rampUpTime": {
"type": "integer",
"minimum": 0,
"description": "Ramp-up time in seconds"
},
"steadyStateTime": {
"type": "integer",
"minimum": 0,
"description": "Steady state duration in seconds"
},
"rampDownTime": {
"type": "integer",
"minimum": 0,
"description": "Ramp-down time in seconds"
}
}
},
"dataTransferMetrics": {
"type": "object",
"properties": {
"totalDataSent": {
"type": "integer",
"minimum": 0,
"description": "Total data sent in bytes"
},
"totalDataReceived": {
"type": "integer",
"minimum": 0,
"description": "Total data received in bytes"
},
"avgDataSentPerRequest": {
"type": "number",
"minimum": 0,
"description": "Average data sent per request in bytes"
},
"avgDataReceivedPerRequest": {
"type": "number",
"minimum": 0,
"description": "Average data received per request in bytes"
},
"bandwidthUtilization": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Bandwidth utilization percentage"
}
}
},
"slaCompliance": {
"type": "object",
"required": ["overallCompliant"],
"properties": {
"overallCompliant": {
"type": "boolean",
"description": "Whether all SLAs are met"
},
"thresholds": {
"type": "array",
"items": {
"$ref": "#/$defs/slaThreshold"
},
"description": "Individual SLA threshold results"
},
"compliancePercentage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percentage of SLAs met"
},
"violations": {
"type": "array",
"items": {
"$ref": "#/$defs/slaViolation"
},
"description": "SLA violations detected"
}
}
},
"slaThreshold": {
"type": "object",
"required": ["metric", "operator", "threshold", "actual", "passed"],
"properties": {
"metric": {
"type": "string",
"description": "Metric name (e.g., 'p95_response_time', 'error_rate')"
},
"operator": {
"type": "string",
"enum": ["<", "<=", ">", ">=", "==", "!="],
"description": "Comparison operator"
},
"threshold": {
"type": "number",
"description": "Threshold value"
},
"actual": {
"type": "number",
"description": "Actual measured value"
},
"passed": {
"type": "boolean",
"description": "Whether threshold was met"
},
"unit": {
"type": "string",
"description": "Unit of measurement"
},
"description": {
"type": "string",
"description": "Human-readable description"
}
}
},
"slaViolation": {
"type": "object",
"required": ["metric", "severity"],
"properties": {
"metric": {
"type": "string",
"description": "Violated metric name"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Severity of the violation"
},
"expected": {
"type": "number",
"description": "Expected threshold value"
},
"actual": {
"type": "number",
"description": "Actual measured value"
},
"deviation": {
"type": "number",
"description": "Percentage deviation from threshold"
},
"impact": {
"type": "string",
"description": "Business impact description"
},
"timestamp": {
"type": "string",
"type": "string",
"description": "When violation was detected"
}
}
},
"bottleneck": {
"type": "object",
"required": ["id", "type", "severity", "description"],
"properties": {
"id": {
"type": "string",
"pattern": "^PERF-\\d{3,6}$",
"description": "Unique bottleneck identifier (e.g., PERF-001)"
},
"type": {
"type": "string",
"enum": ["cpu", "memory", "disk", "network", "database", "api", "cache", "queue", "thread-pool", "connection-pool", "external-service", "application", "other"],
"description": "Type of bottleneck"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Severity of the bottleneck"
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Detailed description of the bottleneck"
},
"component": {
"type": "string",
"description": "Affected system component"
},
"threshold": {
"type": "number",
"description": "Threshold at which bottleneck occurs (e.g., VU count)"
},
"impact": {
"type": "string",
"description": "Performance impact description"
},
"evidence": {
"type": "string",
"maxLength": 2000,
"description": "Evidence supporting the bottleneck identification"
},
"recommendation": {
"type": "string",
"description": "Recommended fix for the bottleneck"
},
"estimatedImprovement": {
"type": "string",
"description": "Estimated improvement if bottleneck is resolved"
}
}
},
"performanceFinding": {
"type": "object",
"required": ["id", "title", "severity"],
"properties": {
"id": {
"type": "string",
"pattern": "^PERF-\\d{3,6}$",
"description": "Unique finding identifier"
},
"title": {
"type": "string",
"minLength": 10,
"maxLength": 200,
"description": "Finding title"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Detailed finding description"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"],
"description": "Finding severity"
},
"category": {
"type": "string",
"enum": ["latency", "throughput", "error-rate", "resource", "scalability", "stability", "memory-leak", "connection-exhaustion", "timeout", "other"],
"description": "Finding category"
},
"metric": {
"type": "string",
"description": "Related metric"
},
"value": {
"type": "number",
"description": "Measured value"
},
"threshold": {
"type": "number",
"description": "Threshold value"
},
"location": {
"$ref": "#/$defs/location",
"description": "Location of the issue"
},
"evidence": {
"type": "string",
"description": "Supporting evidence"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Confidence in finding (0.0-1.0)"
}
}
},
"performanceRecommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-\\d{3,6}$",
"description": "Unique recommendation identifier"
},
"title": {
"type": "string",
"minLength": 10,
"maxLength": 200,
"description": "Recommendation title"
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Detailed recommendation"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"],
"description": "Implementation priority"
},
"effort": {
"type": "string",
"enum": ["trivial", "low", "medium", "high", "major"],
"description": "Estimated implementation effort"
},
"impact": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Expected performance impact (1-10)"
},
"category": {
"type": "string",
"enum": ["optimization", "scaling", "caching", "database", "infrastructure", "code", "configuration", "architecture"],
"description": "Recommendation category"
},
"relatedBottlenecks": {
"type": "array",
"items": {
"type": "string",
"pattern": "^PERF-\\d{3,6}$"
},
"description": "Related bottleneck IDs"
},
"estimatedImprovement": {
"type": "string",
"description": "Estimated performance improvement"
},
"codeExample": {
"type": "object",
"properties": {
"before": { "type": "string" },
"after": { "type": "string" },
"language": { "type": "string" }
},
"description": "Before/after code examples"
},
"resources": {
"type": "array",
"items": {
"type": "object",
"required": ["title", "url"],
"properties": {
"title": { "type": "string" },
"url": { "type": "string" }
}
},
"maxItems": 10,
"description": "External resources"
}
}
},
"testScenario": {
"type": "object",
"required": ["name", "status"],
"properties": {
"name": {
"type": "string",
"description": "Scenario name"
},
"description": {
"type": "string",
"description": "Scenario description"
},
"status": {
"type": "string",
"enum": ["passed", "failed", "skipped"],
"description": "Scenario execution status"
},
"virtualUsers": {
"type": "integer",
"minimum": 1,
"description": "Virtual users for this scenario"
},
"duration": {
"type": "integer",
"minimum": 0,
"description": "Scenario duration in seconds"
},
"metrics": {
"$ref": "#/$defs/performanceMetrics",
"description": "Scenario-specific metrics"
},
"thresholdsResult": {
"type": "string",
"enum": ["passed", "failed", "partial"],
"description": "Whether scenario met its thresholds"
}
}
},
"resourceUtilization": {
"type": "object",
"properties": {
"cpu": {
"$ref": "#/$defs/resourceMetric",
"description": "CPU utilization"
},
"memory": {
"$ref": "#/$defs/resourceMetric",
"description": "Memory utilization"
},
"disk": {
"$ref": "#/$defs/resourceMetric",
"description": "Disk I/O utilization"
},
"network": {
"$ref": "#/$defs/resourceMetric",
"description": "Network utilization"
},
"database": {
"type": "object",
"properties": {
"connectionPoolUsage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Connection pool usage percentage"
},
"queryTime": {
"type": "number",
"minimum": 0,
"description": "Average query time in ms"
},
"activeConnections": {
"type": "integer",
"minimum": 0,
"description": "Active database connections"
}
},
"description": "Database metrics"
}
}
},
"resourceMetric": {
"type": "object",
"properties": {
"avg": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Average utilization percentage"
},
"max": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Maximum utilization percentage"
},
"min": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Minimum utilization percentage"
},
"p95": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "95th percentile utilization"
}
}
},
"testConfiguration": {
"type": "object",
"properties": {
"target": {
"type": "string",
"description": "Test target (URL or service)"
},
"tool": {
"type": "string",
"enum": ["k6", "artillery", "jmeter", "gatling", "locust", "wrk", "ab", "vegeta", "custom"],
"description": "Performance testing tool used"
},
"toolVersion": {
"type": "string",
"description": "Version of the testing tool"
},
"testType": {
"type": "string",
"enum": ["load", "stress", "endurance", "spike", "volume", "scalability", "smoke", "soak"],
"description": "Type of performance test"
},
"duration": {
"type": "integer",
"minimum": 0,
"description": "Total test duration in seconds"
},
"virtualUsers": {
"type": "integer",
"minimum": 1,
"description": "Number of virtual users"
},
"rampUp": {
"type": "integer",
"minimum": 0,
"description": "Ramp-up time in seconds"
},
"steadyState": {
"type": "integer",
"minimum": 0,
"description": "Steady state duration in seconds"
},
"rampDown": {
"type": "integer",
"minimum": 0,
"description": "Ramp-down time in seconds"
},
"thresholds": {
"type": "object",
"additionalProperties": {
"type": ["string", "number", "array"]
},
"description": "Configured thresholds"
},
"scenarios": {
"type": "array",
"items": {
"type": "string"
},
"description": "Scenario names"
},
"endpoints": {
"type": "array",
"items": {
"type": "string"
},
"description": "Endpoints tested"
},
"environment": {
"type": "string",
"enum": ["development", "staging", "production", "ci"],
"description": "Test environment"
}
}
},
"performanceComparison": {
"type": "object",
"properties": {
"baselineVersion": {
"type": "string",
"description": "Baseline version for comparison"
},
"currentVersion": {
"type": "string",
"description": "Current version being tested"
},
"comparisonType": {
"type": "string",
"enum": ["baseline", "previous", "release", "custom"],
"description": "Type of comparison"
},
"regressionDetected": {
"type": "boolean",
"description": "Whether performance regression was detected"
},
"tolerancePercentage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Allowed deviation percentage"
},
"metrics": {
"type": "array",
"items": {
"$ref": "#/$defs/metricComparison"
},
"description": "Individual metric comparisons"
}
}
},
"metricComparison": {
"type": "object",
"required": ["metric", "baseline", "current"],
"properties": {
"metric": {
"type": "string",
"description": "Metric name"
},
"baseline": {
"type": "number",
"description": "Baseline value"
},
"current": {
"type": "number",
"description": "Current value"
},
"change": {
"type": "number",
"description": "Absolute change"
},
"changePercentage": {
"type": "number",
"description": "Change as percentage"
},
"status": {
"type": "string",
"enum": ["improved", "stable", "degraded", "regression"],
"description": "Comparison status"
},
"withinTolerance": {
"type": "boolean",
"description": "Whether change is within tolerance"
}
}
},
"location": {
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"description": "API endpoint"
},
"method": {
"type": "string",
"enum": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"],
"description": "HTTP method"
},
"service": {
"type": "string",
"description": "Service name"
},
"component": {
"type": "string",
"description": "System component"
},
"file": {
"type": "string",
"description": "Source file if applicable"
},
"line": {
"type": "integer",
"minimum": 1,
"description": "Line number if applicable"
}
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": {
"type": "string",
"enum": ["report", "data", "log", "chart", "flamegraph", "profile", "trace", "config"],
"description": "Artifact type"
},
"path": {
"type": "string",
"maxLength": 500,
"description": "Path to artifact"
},
"format": {
"type": "string",
"enum": ["json", "html", "csv", "xml", "txt", "png", "svg", "pdf"],
"description": "Artifact format"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Artifact description"
},
"sizeBytes": {
"type": "integer",
"minimum": 0,
"description": "File size in bytes"
}
}
},
"timelineEvent": {
"type": "object",
"required": ["timestamp", "event"],
"properties": {
"timestamp": {
"type": "string",
"type": "string",
"description": "Event timestamp"
},
"event": {
"type": "string",
"maxLength": 200,
"description": "Event description"
},
"type": {
"type": "string",
"enum": ["start", "ramp-up", "steady-state", "ramp-down", "checkpoint", "warning", "error", "complete"],
"description": "Event type"
},
"durationMs": {
"type": "integer",
"minimum": 0,
"description": "Duration since previous event"
},
"phase": {
"type": "string",
"enum": ["initialization", "warmup", "load", "cooldown", "analysis", "reporting"],
"description": "Test phase"
},
"virtualUsers": {
"type": "integer",
"minimum": 0,
"description": "Virtual users at this point"
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": {
"type": "integer",
"minimum": 0,
"maximum": 86400000,
"description": "Total execution time in milliseconds (max 24 hours)"
},
"toolsUsed": {
"type": "array",
"items": {
"type": "string",
"enum": ["k6", "artillery", "jmeter", "gatling", "locust", "wrk", "ab", "vegeta", "prometheus", "grafana", "datadog", "newrelic"]
},
"uniqueItems": true,
"description": "Performance tools used"
},
"agentId": {
"type": "string",
"pattern": "^qe-[a-z][a-z0-9-]*$",
"description": "Agent ID (e.g., qe-performance-tester)"
},
"modelUsed": {
"type": "string",
"description": "LLM model used for analysis"
},
"inputHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "SHA-256 hash of input"
},
"targetUrl": {
"type": "string",
"type": "string",
"description": "Target URL"
},
"environment": {
"type": "string",
"enum": ["development", "staging", "production", "ci"],
"description": "Execution environment"
},
"retryCount": {
"type": "integer",
"minimum": 0,
"maximum": 10,
"description": "Number of retries"
}
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": {
"type": "boolean",
"description": "Passes JSON schema validation"
},
"contentValid": {
"type": "boolean",
"description": "Passes content validation"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Confidence score"
},
"warnings": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500
},
"maxItems": 20,
"description": "Validation warnings"
},
"errors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500
},
"maxItems": 20,
"description": "Validation errors"
},
"validatorVersion": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+$",
"description": "Validator version"
}
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 20,
"description": "Performance patterns detected (e.g., n+1-query, connection-pool-exhaustion)"
},
"reward": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Reward signal for learning (0.0-1.0)"
},
"feedbackLoop": {
"type": "object",
"properties": {
"previousRunId": {
"type": "string",
"type": "string",
"description": "Previous run ID for comparison"
},
"improvement": {
"type": "number",
"minimum": -1,
"maximum": 1,
"description": "Improvement over previous run"
}
}
},
"newPerformancePatterns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"pattern": { "type": "string" },
"bottleneckType": { "type": "string" },
"confidence": { "type": "number" }
}
},
"description": "New performance patterns learned"
}
}
}
}
}
{
"skillName": "performance-testing",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"k6",
"artillery",
"jmeter",
"node",
"ajv",
"jsonschema",
"python3"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.testType",
"output.metrics"
],
"requiredNonEmptyFields": [
"output.summary"
],
"mustContainTerms": [
"response",
"throughput"
],
"mustNotContainTerms": [
"TODO",
"placeholder",
"FIXME"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
],
".output.testType": [
"load",
"stress",
"endurance",
"spike",
"volume",
"scalability",
"smoke",
"soak"
]
}
}
Related skills
FAQ
What does performance-testing do?
performance-testing is a Claude Code skill for testing & qa.
When should I use performance-testing?
When you need to helps with testing & qa tasks., or when performance-testing is a claude code skill for testing & qa.
What are the main capabilities?
performance-testing; Testing & QA; AI-coding skill.