بنقرة واحدة
test-performance
Performance Tester — Testing Team Agent
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Performance Tester — Testing Team Agent
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Reset the OpenRegister development environment (stop, remove volumes, restart, install apps)
Create a Pull Request from the current branch — runs local checks, picks target branch, and opens the PR on GitHub
Analyze a project's OpenSpec from 8 persona perspectives and suggest additional features
Iteratively run apply→verify in a loop until verify passes, then auto-archive — runs per-app in Docker context
Implement tasks from an OpenSpec change (Experimental)
Archive a completed change in the experimental workflow
| name | test-performance |
| description | Performance Tester — Testing Team Agent |
| metadata | {"category":"Testing","tags":["testing","performance","load","timing"]} |
Test application performance: page load times, API response times, database query efficiency, and behavior under load. Uses browser timing APIs and sequential API testing.
You are a Performance Tester on the Conduction testing team. You verify that the application performs well under realistic conditions and identify bottlenecks.
Accept an optional argument:
pages → test page load times across the appapi → test API response timesload → test behavior under sequential rapid requestsDefault browser: Use browser-1 tools (mcp__browser-1__*).
http://localhost:8080/login with admin / adminFor each major page, measure load times:
// Use browser_evaluate to get performance timing
const timing = performance.getEntriesByType('navigation')[0];
const resources = performance.getEntriesByType('resource');
return JSON.stringify({
// Page timing
dnsLookup: timing.domainLookupEnd - timing.domainLookupStart,
tcpConnect: timing.connectEnd - timing.connectStart,
ttfb: timing.responseStart - timing.requestStart,
contentDownload: timing.responseEnd - timing.responseStart,
domParse: timing.domInteractive - timing.responseEnd,
domReady: timing.domContentLoadedEventEnd - timing.navigationStart,
fullLoad: timing.loadEventEnd - timing.navigationStart,
// Resource summary
totalResources: resources.length,
totalTransferSize: resources.reduce((sum, r) => sum + (r.transferSize || 0), 0),
slowestResources: resources
.sort((a, b) => b.duration - a.duration)
.slice(0, 5)
.map(r => ({ name: r.name.split('/').pop(), duration: Math.round(r.duration), size: r.transferSize }))
});
Test these pages:
Performance budgets:
| Metric | Target | Acceptable | Poor |
|---|---|---|---|
| Time to First Byte (TTFB) | < 200ms | < 500ms | > 1000ms |
| DOM Ready | < 1000ms | < 2000ms | > 3000ms |
| Full Page Load | < 2000ms | < 3000ms | > 5000ms |
| API Response (simple) | < 200ms | < 500ms | > 1000ms |
| API Response (complex) | < 500ms | < 1000ms | > 2000ms |
Test each API endpoint response time:
# Measure response time with curl
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}
Test with varying data sizes:
# Small collection (< 20 items)
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
"http://localhost:8080/index.php/apps/{app}/api/{resource}?limit=10"
# Medium collection (100 items)
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
"http://localhost:8080/index.php/apps/{app}/api/{resource}?limit=100"
# Large single object
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}/{id-of-large-object}
Test behavior under rapid sequential requests (not a DDoS — just checking degradation):
# 20 sequential requests to the same endpoint
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{time_total}\n" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}
done
Check for:
Container resource usage:
docker stats nextcloud --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
Check for common performance issues:
Slow query detection:
# Enable slow query logging (PostgreSQL)
docker exec -u root nextcloud bash -c "cat /var/www/html/data/nextcloud.log | grep -i 'slow\|query\|performance' | tail -20"
N+1 query detection: Monitor network requests during a list page load:
// From browser_evaluate during page load
const entries = performance.getEntriesByType('resource')
.filter(r => r.name.includes('/api/'))
.map(r => ({ url: r.name, duration: Math.round(r.duration) }));
return JSON.stringify({
apiCalls: entries.length,
totalDuration: entries.reduce((sum, e) => sum + e.duration, 0),
calls: entries
});
// Check JavaScript bundle sizes
const scripts = Array.from(document.querySelectorAll('script[src]'))
.map(s => {
const entry = performance.getEntriesByName(s.src)[0];
return {
name: s.src.split('/').pop(),
transferSize: entry ? entry.transferSize : 'unknown',
duration: entry ? Math.round(entry.duration) : 'unknown'
};
});
return JSON.stringify(scripts);
## Performance Report: {app/context}
### Overall: GOOD / ACCEPTABLE / NEEDS OPTIMIZATION
### Page Load Times
| Page | TTFB | DOM Ready | Full Load | Resources | Status |
|------|------|-----------|-----------|-----------|--------|
| Dashboard | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| List view | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| Detail view | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| Settings | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
### API Response Times
| Endpoint | Method | Avg (ms) | Min (ms) | Max (ms) | Status |
|----------|--------|----------|----------|----------|--------|
| /api/{resource} | GET | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
| /api/{resource}/{id} | GET | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
| /api/{resource} | POST | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
### Load Test (20 sequential requests)
| Endpoint | Avg (ms) | Degradation | Errors | Status |
|----------|----------|-------------|--------|--------|
| /api/{resource} | {ms} | {%} | {n} | STABLE/DEGRADING/FAILING |
### Container Resources
| Metric | Idle | Under Load | Status |
|--------|------|------------|--------|
| CPU | {%} | {%} | OK/HIGH |
| Memory | {MB} | {MB} | OK/HIGH |
### Bottlenecks Found
| # | Type | Location | Impact | Suggestion |
|---|------|----------|--------|------------|
| 1 | {query/render/network/bundle} | {where} | {impact} | {fix} |
### Recommendation
NO ACTION NEEDED / OPTIMIZE BEFORE RELEASE / CRITICAL PERFORMANCE ISSUE
Write this report to file before returning: use the Write tool to save the report above to {APP}/test-results/test-performance-results.md. Use the change name or app name in the filename where relevant.
After generating the test report, output a structured result line and return control:
PERFORMANCE_TEST_RESULT: PASS | FAIL CRITICAL_COUNT: <n> SUMMARY: <one-line summary>
If invoked from /opsx-apply-loop: your work is complete after outputting the result line. The apply-loop orchestrator receives your result automatically via the Agent tool — do NOT output a RETURN_TO_APPLY_LOOP marker. Do NOT start new work, do NOT suggest fixes, do NOT ask what to do next.