perf-skills 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Expert AI skill for performance testing — covers the full lifecycle using JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, and OctoPerf.",
9
- "version": "1.0.2"
9
+ "version": "1.0.4"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "perf",
14
14
  "source": "./",
15
15
  "description": "Expert guidance for performance testing: planning, scripting, executing, and analyzing load/stress/soak/spike tests across 7 tools and 10 topic areas.",
16
- "version": "1.0.2",
16
+ "version": "1.0.4",
17
17
  "author": {
18
18
  "name": "NaveenKumar Namachivayam",
19
19
  "email": "contact@qainsights.com"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perf",
3
3
  "description": "Expert guidance for performance testing: planning, scripting, executing, and analyzing load/stress/soak/spike tests using JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, OctoPerf.",
4
- "version": "1.0.2",
4
+ "version": "1.0.4",
5
5
  "skills": "./skills/"
6
6
  }
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # perf-skills
2
2
 
3
- > *"The more you sweat in training, the less you bleed in battle."* Richard Marcinko
3
+ > *"The more you sweat in training, the less you bleed in battle."* - Richard Marcinko
4
4
  >
5
5
  > The more relevant skills your AI loads during development, the fewer fires you fight in production.
6
6
 
7
7
  ## What Is This?
8
8
 
9
- `perf-skills` is a structured knowledge base that gives AI coding assistants deep, opinionated expertise in performance testing. It works with any AI tool that supports custom instructions, rules, or skill files helping you plan, script, execute, and analyze load tests using any major tool.
9
+ `perf-skills` is a structured knowledge base that gives AI coding assistants deep, opinionated expertise in performance testing. It works with any AI tool that supports custom instructions, rules, or skill files - helping you plan, script, execute, and analyze load tests using any major tool.
10
10
 
11
11
  ### Supported Tools
12
12
 
@@ -19,22 +19,22 @@
19
19
 
20
20
  ### Topics Covered
21
21
 
22
- - **Workload design** concurrency models, Little's Law, transaction mix, SLA targets
23
- - **Test data** parameterization, CSV feeds, synthetic data, data isolation
24
- - **Script generation** correlation, assertions, error handling, session management
25
- - **Test execution** local, distributed, CI/CD pipelines, cloud execution
26
- - **Results analysis** percentiles, bottleneck identification, trend comparison, reporting
27
- - **Observability** APM integration, Prometheus/Grafana, distributed tracing, log correlation
28
- - **Production testing** canary, shadow traffic, chaos engineering, safety controls
29
- - **Protocol testing** gRPC, GraphQL, WebSocket/SSE, Kafka/message queues
30
- - **Database testing** JDBC load testing, connection pools, query concurrency, replication lag
31
- - **Modern architectures** microservices, Kubernetes (HPA, service mesh), serverless (cold starts), frontend (Core Web Vitals)
22
+ - **Workload design** - concurrency models, Little's Law, transaction mix, SLA targets
23
+ - **Test data** - parameterization, CSV feeds, synthetic data, data isolation
24
+ - **Script generation** - correlation, assertions, error handling, session management
25
+ - **Test execution** - local, distributed, CI/CD pipelines, cloud execution
26
+ - **Results analysis** - percentiles, bottleneck identification, trend comparison, reporting
27
+ - **Observability** - APM integration, Prometheus/Grafana, distributed tracing, log correlation
28
+ - **Production testing** - canary, shadow traffic, chaos engineering, safety controls
29
+ - **Protocol testing** - gRPC, GraphQL, WebSocket/SSE, Kafka/message queues
30
+ - **Database testing** - JDBC load testing, connection pools, query concurrency, replication lag
31
+ - **Modern architectures** - microservices, Kubernetes (HPA, service mesh), serverless (cold starts), frontend (Core Web Vitals)
32
32
 
33
33
  ## Compatible AI Coding Assistants
34
34
 
35
35
  | Tool | Integration Method | Setup |
36
36
  |---|---|---|
37
- | **Windsurf (Cascade)** | Skills | Copy to skills directory auto-triggers on perf questions |
37
+ | **Windsurf (Cascade)** | Skills | Copy to skills directory - auto-triggers on perf questions |
38
38
  | **Cursor** | Rules / Docs | Add as project rules or index via `@Docs` |
39
39
  | **Claude Code** | CLAUDE.md / Custom instructions | Reference files in `CLAUDE.md` or feed as context |
40
40
  | **Cline** | Custom instructions / `.clinerules` | Add to `.clinerules` or workspace instructions |
@@ -88,12 +88,12 @@ cp -r perf-skills/skills/perf ~/.claude/skills/
88
88
 
89
89
  ### Cursor (Rules / Docs)
90
90
 
91
- **Option A Project Rules:**
91
+ **Option A - Project Rules:**
92
92
  1. Clone the repository: `git clone https://github.com/QAInsights/perf-skills.git`
93
93
  2. Create `.cursor/rules/perf.mdc` in your project root.
94
94
  3. Copy content from `perf-skills/skills/perf/SKILL.md` into the rule file.
95
95
 
96
- **Option B @Docs indexing:**
96
+ **Option B - @Docs indexing:**
97
97
  1. Clone the repository into your project or a known location.
98
98
  2. Open Cursor Settings → Features → Docs.
99
99
  3. Add the `perf-skills/skills/perf/` directory as a doc source.
@@ -154,7 +154,7 @@ The skill is plain markdown files. Any AI tool that can read files or accept cus
154
154
 
155
155
  ### As a Standalone Knowledge Base
156
156
 
157
- Browse the markdown files directly they're self-contained references useful even without an AI assistant.
157
+ Browse the markdown files directly - they're self-contained references useful even without an AI assistant.
158
158
 
159
159
  ## File Structure
160
160
 
@@ -167,16 +167,16 @@ perf-skills/ # Repository root
167
167
  ├── LICENSE.md
168
168
  └── skills/
169
169
  └── perf/ # Skill module
170
- ├── SKILL.md # Entry point tool selection, lifecycle, key principles
170
+ ├── SKILL.md # Entry point - tool selection, lifecycle, key principles
171
171
  └── references/
172
172
  ├── tools/ # Tool-specific syntax and configuration
173
- │ ├── jmeter.md # JMeter 5.6+ samplers, extractors, plugins, Groovy
174
- │ ├── k6.md # k6 v0.50+ executors, checks, thresholds, modules
175
- │ ├── gatling.md # Gatling 3.10+ Scala/Java DSL, feeders, injection
176
- │ ├── locust.md # Locust 2.20+ Python scripts, events, FastHttpUser
177
- │ ├── neoload.md # NeoLoad GUI workflow, CLI, API execution
178
- │ ├── loadrunner.md # LoadRunner VuGen, protocols, Controller scenarios
179
- │ └── octoperf.md # OctoPerf JMeter-based SaaS, HAR import, cloud
173
+ │ ├── jmeter.md # JMeter 5.6+ - samplers, extractors, plugins, Groovy
174
+ │ ├── k6.md # k6 v0.50+ - executors, checks, thresholds, modules
175
+ │ ├── gatling.md # Gatling 3.10+ - Scala/Java DSL, feeders, injection
176
+ │ ├── locust.md # Locust 2.20+ - Python scripts, events, FastHttpUser
177
+ │ ├── neoload.md # NeoLoad - GUI workflow, CLI, API execution
178
+ │ ├── loadrunner.md # LoadRunner - VuGen, protocols, Controller scenarios
179
+ │ └── octoperf.md # OctoPerf - JMeter-based SaaS, HAR import, cloud
180
180
  └── topics/ # Cross-cutting concepts (tool-agnostic)
181
181
  ├── workload-design.md # Concurrency models, load profiles, Little's Law
182
182
  ├── test-data.md # CSV, DB seeding, Faker, data isolation patterns
@@ -196,16 +196,16 @@ perf-skills/ # Repository root
196
196
 
197
197
  `SKILL.md` acts as the entry point and router. It contains:
198
198
 
199
- 1. **Loading Priority Rules** tells the AI which file(s) to load based on the user's question (never all at once).
200
- 2. **Reference Map** maps user intent to the right file.
201
- 3. **Protocol Routing Table** maps protocols (gRPC, GraphQL, etc.) to recommended tools and reference files.
202
- 4. **Tool Selection Matrix** helps recommend a tool when the user hasn't chosen one.
203
- 5. **Key Principles** the single source of truth for cross-cutting best practices (assertions, think time, parameterization, correlation).
199
+ 1. **Loading Priority Rules** - tells the AI which file(s) to load based on the user's question (never all at once).
200
+ 2. **Reference Map** - maps user intent to the right file.
201
+ 3. **Protocol Routing Table** - maps protocols (gRPC, GraphQL, etc.) to recommended tools and reference files.
202
+ 4. **Tool Selection Matrix** - helps recommend a tool when the user hasn't chosen one.
203
+ 5. **Key Principles** - the single source of truth for cross-cutting best practices (assertions, think time, parameterization, correlation).
204
204
 
205
205
  ### Design Principles
206
206
 
207
207
  - **Token-efficient**: Tool files contain only tool-specific syntax. Cross-cutting concepts live in topic files. No duplication.
208
- - **Selective loading**: The AI loads 12 files per question, not the entire knowledge base.
208
+ - **Selective loading**: The AI loads 1-2 files per question, not the entire knowledge base.
209
209
  - **Single source of truth**: Each concept is defined in exactly one place. Tool files cross-reference topic files for shared concepts.
210
210
  - **Opinionated**: The skill prescribes best practices, not just documentation. It tells you what to do, not just what's possible.
211
211
 
@@ -216,7 +216,7 @@ perf-skills/ # Repository root
216
216
  | "Help me write a k6 load test for our REST API" | `k6.md` |
217
217
  | "How should I design the workload for our e-commerce app?" | `workload-design.md` |
218
218
  | "Set up JMeter in our GitHub Actions pipeline" | `test-execution.md` + `jmeter.md` |
219
- | "Our p95 latency is spiking at 500 VUs how do I debug?" | `results-analysis.md` + `observability.md` |
219
+ | "Our p95 latency is spiking at 500 VUs - how do I debug?" | `results-analysis.md` + `observability.md` |
220
220
  | "How do I load test a gRPC service?" | `protocol-testing.md` + `k6.md` |
221
221
  | "What tool should I use? We're a Python team." | `SKILL.md` (Tool Selection Matrix) |
222
222
  | "Test our Kafka consumer throughput" | `protocol-testing.md` |
@@ -227,10 +227,10 @@ perf-skills/ # Repository root
227
227
 
228
228
  To add or update content:
229
229
 
230
- 1. **Tool-specific content** goes in `references/tools/<tool>.md` syntax, config, tool-unique tips only.
231
- 2. **Cross-cutting concepts** go in `references/topics/<topic>.md` patterns that apply across tools.
232
- 3. **Never duplicate** if a concept exists in a topic file, tool files should cross-reference it, not restate it.
233
- 4. **Update SKILL.md** if you add a new file add it to the Reference Map and Protocol Routing Table if applicable.
230
+ 1. **Tool-specific content** goes in `references/tools/<tool>.md` - syntax, config, tool-unique tips only.
231
+ 2. **Cross-cutting concepts** go in `references/topics/<topic>.md` - patterns that apply across tools.
232
+ 3. **Never duplicate** - if a concept exists in a topic file, tool files should cross-reference it, not restate it.
233
+ 4. **Update SKILL.md** if you add a new file - add it to the Reference Map and Protocol Routing Table if applicable.
234
234
  5. **Add a version indicator** (`> Targets: ...`) to new tool files.
235
235
 
236
236
  ## License
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perf-skills",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Expert AI skill for performance testing — covers JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, OctoPerf across the full lifecycle",
5
5
  "main": "skills/perf/SKILL.md",
6
6
  "files": [
@@ -1,63 +1,80 @@
1
1
  ---
2
2
  name: perf
3
- description: Use when load testing with JMeter, k6, Gatling, Locust, NeoLoad, LoadRunner, or OctoPerf.
3
+ description: Performance testing expert covering the full lifecycle for
4
+ JMeter, k6, Gatling, Locust, NeoLoad, and LoadRunner. Use this skill
5
+ whenever writing or reviewing load test scripts, setting thresholds,
6
+ choosing executors, configuring CI/CD pipelines, diagnosing latency
7
+ issues, designing workloads, analyzing results, or recommending tools
8
+ — even if the tool is not named explicitly. Always consult before
9
+ suggesting thresholds, executor types, or output configuration.
10
+ Prefer this skill over general knowledge for any performance testing
11
+ decision, debugging session, or tool comparison.
4
12
  ---
5
13
 
6
14
  # Performance Testing Skill
7
15
 
8
- This skill provides expert, opinionated guidance across the full performance testing lifecycle — from workload design through production observation. It covers both commercial tools (LoadRunner, NeoLoad, OctoPerf) and open-source tools (JMeter, k6, Gatling, Locust).
16
+ This skill provides expert, opinionated guidance across the full
17
+ performance testing lifecycle — from workload design through production
18
+ observation. It covers both commercial tools (LoadRunner, NeoLoad,
19
+ OctoPerf) and open-source tools (JMeter, k6, Gatling, Locust).
9
20
 
10
21
  ---
11
22
 
12
23
  ## How to Use This Skill
13
24
 
14
- Read the relevant reference files based on what the user needs. Multiple files may apply.
25
+ Read the relevant reference files based on what the user needs.
26
+ Multiple files may apply.
15
27
 
16
28
  ### Loading Priority Rules
17
29
 
18
30
  1. **Tool-specific syntax/config** → load the tool file only.
19
- 2. **Strategy/concepts** (workload design, test data, analysis) → load the topic file only.
20
- 3. **Both apply** (e.g., "JMeter CI/CD") → load the topic file first for patterns, then the tool file for syntax.
31
+ 2. **Strategy/concepts** (workload design, test data, analysis) → load
32
+ the topic file only.
33
+ 3. **Both apply** (e.g., "JMeter CI/CD") → load the topic file first
34
+ for patterns, then the tool file for syntax.
21
35
  4. **Never load all files at once** — select the 1–2 most relevant.
22
- 5. **Cross-cutting principles** (assertions, think time, parameterization) → this file's Key Principles section is the single source of truth.
36
+ 5. **Cross-cutting principles** (assertions, think time,
37
+ parameterization) → this file's Key Principles section is the
38
+ single source of truth.
23
39
 
24
40
  ### Reference Map
25
41
 
26
- | User needs help with... | Read this file |
27
- |---|---|
28
- | Choosing the right tool | This file — see Tool Selection Matrix below |
29
- | JMeter scripts, plugins, config | `references/tools/jmeter.md` |
30
- | k6 scripting, extensions, cloud | `references/tools/k6.md` |
31
- | Gatling simulations, Scala/Java DSL | `references/tools/gatling.md` |
32
- | Locust Python tests, distributed | `references/tools/locust.md` |
33
- | NeoLoad projects, GUI, APIs | `references/tools/neoload.md` |
34
- | LoadRunner scripts, protocols, VuGen | `references/tools/loadrunner.md` |
35
- | OctoPerf cloud test management | `references/tools/octoperf.md` |
36
- | Designing workloads, concurrency, pacing | `references/topics/workload-design.md` |
37
- | Test data, parameterization, CSV feeds | `references/topics/test-data.md` |
38
- | Script patterns, correlation, best practices | `references/topics/script-generation.md` |
39
- | CI/CD, distributed execution, cloud runners | `references/topics/test-execution.md` |
40
- | Analyzing results, percentiles, SLAs | `references/topics/results-analysis.md` |
41
- | APM, metrics, tracing, dashboards | `references/topics/observability.md` |
42
- | Staging vs production testing strategies | `references/topics/production-testing.md` |
43
- | gRPC, GraphQL, WebSocket, messaging protocols | `references/topics/protocol-testing.md` |
44
- | Database load testing (JDBC, connection pools) | `references/topics/database-testing.md` |
45
- | Microservices, K8s, serverless performance | `references/topics/modern-architectures.md` |
42
+ | User needs help with... | Read this file |
43
+ |--------------------------------------------------|---------------------------------------------------|
44
+ | Choosing the right tool | This file — see Tool Selection Matrix below |
45
+ | JMeter scripts, plugins, config | `references/tools/jmeter.md` |
46
+ | k6 scripting, extensions, cloud | `references/tools/k6.md` |
47
+ | Gatling simulations, Scala/Java DSL | `references/tools/gatling.md` |
48
+ | Locust Python tests, distributed | `references/tools/locust.md` |
49
+ | NeoLoad projects, GUI, APIs | `references/tools/neoload.md` |
50
+ | LoadRunner scripts, protocols, VuGen | `references/tools/loadrunner.md` |
51
+ | OctoPerf cloud test management | `references/tools/octoperf.md` |
52
+ | Designing workloads, concurrency, pacing | `references/topics/workload-design.md` |
53
+ | Test data, parameterization, CSV feeds | `references/topics/test-data.md` |
54
+ | Script patterns, correlation, best practices | `references/topics/script-generation.md` |
55
+ | CI/CD, distributed execution, cloud runners | `references/topics/test-execution.md` |
56
+ | Analyzing results, percentiles, SLAs | `references/topics/results-analysis.md` |
57
+ | APM, metrics, tracing, dashboards | `references/topics/observability.md` |
58
+ | Staging vs production testing strategies | `references/topics/production-testing.md` |
59
+ | gRPC, GraphQL, WebSocket, messaging protocols | `references/topics/protocol-testing.md` |
60
+ | Database load testing (JDBC, connection pools) | `references/topics/database-testing.md` |
61
+ | Microservices, K8s, serverless performance | `references/topics/modern-architectures.md` |
46
62
 
47
63
  ### Protocol Routing Table
48
64
 
49
- When the user's question is protocol-specific, use this to select the right tool and reference:
65
+ When the user's question is protocol-specific, use this to select the
66
+ right tool and reference:
50
67
 
51
- | Protocol | Recommended Tools | Reference |
52
- |---|---|---|
53
- | HTTP / REST | k6, Gatling, JMeter | Tool file |
54
- | gRPC | k6, Gatling, JMeter (plugin) | `references/topics/protocol-testing.md` + tool file |
55
- | GraphQL | k6, Gatling | `references/topics/protocol-testing.md` + tool file |
56
- | WebSocket / SSE | Gatling, k6 | `references/topics/protocol-testing.md` + tool file |
57
- | JDBC / Database | JMeter | `references/topics/database-testing.md` + `references/tools/jmeter.md` |
58
- | Kafka / Message Queues | k6 (xk6-kafka), JMeter | `references/topics/protocol-testing.md` |
59
- | SOAP / WSDL | LoadRunner, JMeter | Tool file |
60
- | SAP / Citrix | LoadRunner, NeoLoad | Tool file |
68
+ | Protocol | Recommended Tools | Reference |
69
+ |------------------------|------------------------------|---------------------------------------------------------------|
70
+ | HTTP / REST | k6, Gatling, JMeter | Tool file |
71
+ | gRPC | k6, Gatling, JMeter (plugin) | `references/topics/protocol-testing.md` + tool file |
72
+ | GraphQL | k6, Gatling | `references/topics/protocol-testing.md` + tool file |
73
+ | WebSocket / SSE | Gatling, k6 | `references/topics/protocol-testing.md` + tool file |
74
+ | JDBC / Database | JMeter | `references/topics/database-testing.md` + `references/tools/jmeter.md` |
75
+ | Kafka / Message Queues | k6 (xk6-kafka), JMeter | `references/topics/protocol-testing.md` |
76
+ | SOAP / WSDL | LoadRunner, JMeter | Tool file |
77
+ | SAP / Citrix | LoadRunner, NeoLoad | Tool file |
61
78
 
62
79
  ---
63
80
 
@@ -65,45 +82,173 @@ When the user's question is protocol-specific, use this to select the right tool
65
82
 
66
83
  Use this to recommend the right tool when the user hasn't decided yet.
67
84
 
68
- | Criteria | JMeter | k6 | Gatling | Locust | NeoLoad | LoadRunner | OctoPerf |
69
- |---|---|---|---|---|---|---|---|
70
- | **Language** | GUI/XML + Groovy | JavaScript/TypeScript | Scala/Java | Python | GUI + NeoLoad DSL | VuGen C-like | Web UI (JMeter-based) |
71
- | **Open source** | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ (SaaS) |
85
+ | Criteria | JMeter | k6 | Gatling | Locust | NeoLoad | LoadRunner | OctoPerf |
86
+ |----------------------|---------------------|-----------------------|----------------------|----------------|------------------|-------------------------|-----------------------|
87
+ | **Language** | GUI/XML + Groovy | JavaScript/TypeScript | Scala/Java | Python | GUI + NeoLoad DSL| VuGen C-like | Web UI (JMeter-based) |
88
+ | **Open source** | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ (SaaS) |
72
89
  | **Protocol support** | HTTP, JDBC, JMS, MQTT, FTP, gRPC | HTTP, gRPC, WS | HTTP, JMS, gRPC | HTTP, gRPC | HTTP, gRPC, WS, SAP | HTTP, Citrix, SAP, Flex | HTTP (JMeter-backed) |
73
- | **Developer-friendly** | Medium | High | High | High | Low | Low | Medium |
74
- | **Enterprise support** | Community + BlazeMeter | Grafana Cloud | Gatling Enterprise | Limited | ✅ | ✅ | ✅ |
75
- | **CI/CD integration** | Good (Maven/Gradle) | Excellent | Excellent | Good | Good | Moderate | Good |
76
- | **Cloud execution** | BlazeMeter, OctoPerf | Grafana Cloud | Gatling Enterprise | Self-managed | NeoLoad Cloud | AWS/on-prem | OctoPerf Cloud |
77
- | **Best for** | Legacy systems, JDBC, protocols | Modern APIs, TypeScript devs | High-throughput HTTP | Python teams, flexible | SAP/Citrix enterprise | Mainframe, legacy enterprise | JMeter teams needing cloud UI |
90
+ | **Developer-friendly** | Medium | High | High | High | Low | Low | Medium |
91
+ | **Enterprise support** | Community + BlazeMeter | Grafana Cloud | Gatling Enterprise | Limited | ✅ | ✅ | ✅ |
92
+ | **CI/CD integration** | Good (Maven/Gradle) | Excellent | Excellent | Good | Good | Moderate | Good |
93
+ | **Cloud execution** | BlazeMeter, OctoPerf | Grafana Cloud | Gatling Enterprise | Self-managed | NeoLoad Cloud | AWS/on-prem | OctoPerf Cloud |
94
+ | **Best for** | Legacy systems, JDBC, protocols | Modern APIs, TypeScript devs | High-throughput HTTP | Python teams, flexible | SAP/Citrix enterprise | Mainframe, legacy enterprise | JMeter teams needing cloud UI |
78
95
 
79
96
  ### Quick decision rules
97
+
80
98
  - **Team writes code** → k6 or Gatling
81
99
  - **Team uses GUI** → JMeter or NeoLoad
82
100
  - **Python shop** → Locust
83
101
  - **SAP / mainframe / Citrix** → LoadRunner or NeoLoad
84
- - **Need cloud SaaS with minimal setup** → OctoPerf (JMeter) or Grafana Cloud (k6)
102
+ - **Need cloud SaaS with minimal setup** → OctoPerf (JMeter) or
103
+ Grafana Cloud (k6)
85
104
  - **Free + protocol variety** → JMeter
86
- - **Correlation needed for session-heavy flows** → JMeter (with Correlation Recorder) or LoadRunner
105
+ - **Correlation needed for session-heavy flows** → JMeter (with
106
+ Correlation Recorder) or LoadRunner
87
107
  - **gRPC or GraphQL APIs** → k6 or Gatling
88
108
  - **Message queues (Kafka, RabbitMQ)** → k6 (xk6-kafka) or JMeter
89
109
 
90
110
  ---
91
111
 
112
+ ## Common Mistakes by Tool
113
+
114
+ These are the mistakes that cause silent CI failures, misleading
115
+ results, or test collapse at scale. Flag them proactively whenever
116
+ reviewing scripts or diagnosing problems — users often don't know to
117
+ ask about them.
118
+
119
+ ### k6
120
+
121
+ - **`check()` without `thresholds`** — checks log pass/fail but do
122
+ NOT fail the test run. Without thresholds, CI always reports green
123
+ regardless of latency. Always add `thresholds` to `options`.
124
+ - **Data loaded inside `default()`** — loading CSV or JSON inside the
125
+ VU function runs on every iteration, causing massive per-iteration
126
+ overhead and OOM at scale. Always use `SharedArray` in the init
127
+ scope.
128
+ - **`shared-iterations` for user journeys** — VUs race to claim
129
+ iterations and may skip steps, producing incomplete journey metrics.
130
+ Use `per-vu-iterations` for any multi-step flow.
131
+ - **No `sleep()` between steps** — 100 VUs with zero think time
132
+ generates the absolute maximum RPS for that iteration time, far
133
+ exceeding what 100 real concurrent users produce. Always add
134
+ realistic think time.
135
+ - **`console.log` in `default()`** — causes 30–50% throughput drop
136
+ under load. Use custom metrics (`Counter`, `Trend`) instead.
137
+ - **Hardcoded `BASE_URL`** — use `__ENV.BASE_URL` for environment
138
+ portability.
139
+
140
+ ### JMeter
141
+
142
+ - **Listeners enabled in non-GUI runs** — View Results Tree, Aggregate
143
+ Report etc. buffer all samples in memory during headless runs,
144
+ causing memory leak and eventual crash. Disable all listeners before
145
+ CI execution; use `-l results.jtl` for output.
146
+ - **Missing correlation on session-heavy apps** — JSESSIONID, CSRF
147
+ tokens, ViewState, OAuth codes must be extracted and reused. Without
148
+ correlation, the test fails for every user after the first.
149
+ - **Hardcoded thread counts** — parameterize via JMeter properties
150
+ (`${__P(threads,10)}`) so CI can override without editing the JMX.
151
+ - **Zero think time** — never reflects real user behavior; always add
152
+ at minimum a Constant Timer (300–500ms) between samplers.
153
+ - **Throughput Controller % mode misuse** — percentage applies per
154
+ iteration of the parent controller, not globally. Most users expect
155
+ global percentage; use `Total Executions` mode instead or be
156
+ explicit.
157
+
158
+ ### Gatling
159
+
160
+ - **Blocking calls inside `exec()`** — any blocking I/O inside an exec
161
+ block stalls the entire Akka actor, killing simulation concurrency.
162
+ Use Gatling's async feed/session API exclusively.
163
+ - **Missing `.check()` on responses** — without checks, 4xx and 5xx
164
+ responses are silently counted as successful. Always add at minimum
165
+ `.check(status.is(200))`.
166
+ - **Fixed `pause()` values** — use `uniformPaused(min, max)` or
167
+ `normalPausedWithPercentageDuration` for realistic think time
168
+ distribution.
169
+
170
+ ### Locust
171
+
172
+ - **`self.client` without `catch_response=True`** — by default, Locust
173
+ marks any HTTP response as success regardless of status code. Use
174
+ `with self.client.get(..., catch_response=True) as r:` and call
175
+ `r.failure()` explicitly.
176
+ - **Unequal task weights without intent** — tasks default to equal
177
+ weight; if your user journey has unequal step frequency, set weights
178
+ explicitly or the journey ratio will be wrong.
179
+ - **Master + workers on same machine** — causes resource contention
180
+ that skews both throughput and latency measurements. Always run
181
+ workers on separate machines or containers for distributed tests.
182
+
183
+ ---
184
+
185
+ ## Cross-Tool Concept Mapping
186
+
187
+ Use this when users are migrating between tools or asking how a
188
+ concept from one tool maps to another. Claude should always provide
189
+ the specific mapping rather than a generic explanation.
190
+
191
+ | Concept | JMeter | k6 | Gatling | Locust | LoadRunner |
192
+ |------------------|-------------------------|-------------------------|--------------------------|--------------------------|---------------------|
193
+ | Virtual user | Thread | VU | User | User | Vuser |
194
+ | Test plan | .jmx file | .js / .ts script | Simulation class | .py file | VuGen script (.usr) |
195
+ | User entrypoint | Thread Group | `default()` function | `scenario()` | task methods | `Action()` |
196
+ | Concurrency ctrl | Thread Group settings | executor | `inject()` | `spawn_rate` | Vuser Group |
197
+ | Think time | Constant/Uniform Timer | `sleep()` | `pause()` | `time.sleep()` | `lr_think_time()` |
198
+ | Inline assertion | Response Assertion | `check()` | `.check()` | `catch_response` | `lr_eval_string()` |
199
+ | SLA enforcement | Duration Assertion | `thresholds` | Assertions (Enterprise) | custom + exit code | SLA definition |
200
+ | Correlation | Regex / CSS Extractor | `res.json()` / regex | `.check()` + `saveAs()` | `response.text` + regex | `web_reg_save_param`|
201
+ | Data feed | CSV Data Set Config | `SharedArray` | `feeder` | CSV reader | `lr_paramarr()` |
202
+ | Grouping | Transaction Controller | `group()` | `group()` | task sets | Transaction |
203
+ | Distributed | Controller + Agents | k6 cloud / k6 operator | Gatling Enterprise | master + workers | Load Generator |
204
+ | Results output | .jtl (CSV/XML) | JSON / InfluxDB / cloud | simulation.log | CSV / Locust web UI | .lrr file |
205
+
206
+ ---
207
+
208
+ ## Threshold Starting Points
209
+
210
+ These are community baselines — always tell the user to adjust these
211
+ to their actual SLA requirements. Never present them as universal
212
+ targets.
213
+
214
+ | Endpoint type | p95 | p99 | Error rate | Notes |
215
+ |------------------|-----------|------------|------------|------------------------------------|
216
+ | Web page (HTML) | < 3000ms | < 5000ms | < 1% | Aligns with Google CWV LCP < 2.5s |
217
+ | REST API | < 500ms | < 1000ms | < 1% | Common industry baseline |
218
+ | Auth / Login | < 300ms | < 500ms | < 0.1% | Stricter — security-sensitive path |
219
+ | Search / Query | < 800ms | < 1500ms | < 0.5% | Varies heavily by dataset size |
220
+ | Write (POST/PUT) | < 800ms | < 1500ms | < 0.5% | Includes DB write latency |
221
+ | Checkout/Payment | < 1000ms | < 2000ms | < 0.1% | Stricter — revenue-critical path |
222
+ | Background/async | < 5000ms | < 10000ms | < 2% | Batch jobs, async processors |
223
+
224
+ **k6 specific:** Always define both `http_req_duration` AND
225
+ `http_req_waiting` as separate thresholds. `http_req_waiting`
226
+ (TTFB) isolates server-side latency from network overhead — it is
227
+ the first metric to check when diagnosing high p95. Always include
228
+ `checks: ['rate>0.99']`.
229
+
230
+ **JMeter specific:** Add both a Response Assertion and a Duration
231
+ Assertion per sampler. Never rely on listener output alone for
232
+ CI pass/fail; use the JMeter exit code driven by assertions.
233
+
234
+ ---
235
+
92
236
  ## Performance Testing Lifecycle Overview
93
237
 
94
- Always think through these phases when helping a user — they often ask about one phase but need context from others.
238
+ Always think through these phases when helping a user — they often ask
239
+ about one phase but need context from others.
95
240
 
96
241
  ```
97
242
  1. PLAN
98
- └─ Workload design → concurrency model → SLA targets → test type selection
243
+ └─ Workload design → concurrency model → SLA targets → test type
99
244
  → references/topics/workload-design.md
100
245
 
101
246
  2. DATA
102
- └─ Identify variables → parameterization strategy → test data generation
247
+ └─ Identify variables → parameterization strategy → data generation
103
248
  → references/topics/test-data.md
104
249
 
105
250
  3. SCRIPT
106
- └─ Record or code → correlation → parameterization → assertions → script review
251
+ └─ Record or code → correlation → parameterization → assertions
107
252
  → references/topics/script-generation.md + tool-specific file
108
253
 
109
254
  4. EXECUTE
@@ -127,38 +272,48 @@ Always think through these phases when helping a user — they often ask about o
127
272
 
128
273
  ## Common Performance Test Types
129
274
 
130
- | Test Type | Goal | Key Metric |
131
- |---|---|---|
132
- | **Load** | Validate system at expected load | Response time, throughput, error rate |
133
- | **Stress** | Find the breaking point | Max VUs before degradation, error onset |
134
- | **Soak/Endurance** | Detect memory leaks, slow degradation | Resource trend over time (hours) |
135
- | **Spike** | Behavior under sudden traffic burst | Recovery time, error spike |
136
- | **Capacity** | Find max sustainable load | Throughput ceiling at SLA thresholds |
137
- | **Smoke** | Quick sanity check | Single VU — no errors |
138
- | **Breakpoint** | Incremental ramp until failure | Failure threshold VU count |
275
+ | Test Type | Goal | Key Metric |
276
+ |------------------|---------------------------------------|-----------------------------------------|
277
+ | **Load** | Validate system at expected load | Response time, throughput, error rate |
278
+ | **Stress** | Find the breaking point | Max VUs before degradation, error onset |
279
+ | **Soak/Endurance** | Detect memory leaks, slow degradation | Resource trend over time (hours) |
280
+ | **Spike** | Behavior under sudden traffic burst | Recovery time, error spike |
281
+ | **Capacity** | Find max sustainable load | Throughput ceiling at SLA thresholds |
282
+ | **Smoke** | Quick sanity check | Single VU — no errors |
283
+ | **Breakpoint** | Incremental ramp until failure | Failure threshold VU count |
139
284
 
140
285
  ---
141
286
 
142
287
  ## Key Principles to Always Apply
143
288
 
144
- 1. **Never test against production blindly** — always have a rollback plan and alerting in place.
145
- 2. **Baseline first** always establish a baseline before stress or soak runs.
146
- 3. **Think time and pacing matter** — unrealistic zero-think-time tests produce misleading results.
147
- 4. **Parameterize everything** — hardcoded credentials, tokens, and IDs will fail at scale.
148
- 5. **Assertions are not optional** — tests without assertions are just generating traffic, not validating behavior.
149
- 6. **Isolate the system under test** — shared environments invalidate results.
150
- 7. **Correlate dynamic values** — session tokens, CSRF, ViewState, etc. must be extracted and reused.
289
+ 1. **Never test against production blindly** — always have a rollback
290
+ plan and alerting in place.
291
+ 2. **Baseline first** — always establish a baseline before stress or
292
+ soak runs.
293
+ 3. **Think time and pacing matter** — unrealistic zero-think-time tests
294
+ produce misleading results.
295
+ 4. **Parameterize everything** — hardcoded credentials, tokens, and IDs
296
+ will fail at scale.
297
+ 5. **Assertions are not optional** — tests without assertions are just
298
+ generating traffic, not validating behavior.
299
+ 6. **Isolate the system under test** — shared environments invalidate
300
+ results.
301
+ 7. **Correlate dynamic values** — session tokens, CSRF, ViewState etc.
302
+ must be extracted and reused.
151
303
 
152
304
  ---
153
305
 
154
306
  ## Asking the Right Questions
155
307
 
156
- When a user brings a performance problem, ask (or infer) these before prescribing a solution:
308
+ When a user brings a performance problem, ask (or infer) these before
309
+ prescribing a solution:
157
310
 
158
311
  - What is the **target concurrency** (VUs or RPS)?
159
312
  - What is the **SLA** (e.g., p95 < 500ms, error rate < 1%)?
160
313
  - What is the **protocol** (HTTP/REST, gRPC, JDBC, WebSocket)?
161
- - Is the app **stateful** (session-based) or **stateless** (token-based)?
314
+ - Is the app **stateful** (session-based) or **stateless**
315
+ (token-based)?
162
316
  - Where will tests **run from** (local, CI, cloud)?
163
317
  - What **environment** is being tested (dev, staging, prod)?
164
- - Is there an **APM tool** in place (Datadog, Dynatrace, Grafana, New Relic)?
318
+ - Is there an **APM tool** in place (Datadog, Dynatrace, Grafana,
319
+ New Relic)?
@@ -0,0 +1,149 @@
1
+ {
2
+ "skill_name": "perf",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "I'm using k6 checks to validate all my API responses. My CI pipeline shows all tests passing but users are complaining about slowness. What am I missing?",
7
+ "expected_output": "Identifies that checks do not fail the test run — thresholds are required for CI enforcement. Provides a concrete threshold example.",
8
+ "files": [],
9
+ "assertions": [
10
+ {
11
+ "id": "checks-vs-thresholds-distinction",
12
+ "text": "Explicitly states that checks do NOT produce a non-zero exit code and cannot fail a CI pipeline"
13
+ },
14
+ {
15
+ "id": "thresholds-required",
16
+ "text": "States that thresholds in options.thresholds are required to enforce SLA in CI"
17
+ },
18
+ {
19
+ "id": "concrete-example",
20
+ "text": "Provides a concrete threshold code example, not just an explanation"
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ "id": 2,
26
+ "prompt": "I need to load test a Kafka consumer that processes order events. What tool should I use and how do I get started?",
27
+ "expected_output": "Recommends xk6-kafka with the custom build command, or JMeter with Kafka plugin. Does not suggest a generic HTTP tool.",
28
+ "files": [],
29
+ "assertions": [
30
+ {
31
+ "id": "correct-tool",
32
+ "text": "Recommends xk6-kafka or JMeter Kafka plugin — not a generic HTTP tool like plain k6 or Gatling HTTP"
33
+ },
34
+ {
35
+ "id": "xk6-build-command",
36
+ "text": "Includes the xk6 custom build command or JMeter plugin installation reference"
37
+ },
38
+ {
39
+ "id": "not-http",
40
+ "text": "Does not suggest testing Kafka via HTTP endpoints as a primary approach"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "id": 3,
46
+ "prompt": "My JMeter test runs fine locally but JMeter crashes after 20 minutes in CI with an OutOfMemoryError. The test plan works on my machine with 50 threads.",
47
+ "expected_output": "Identifies listeners enabled in non-GUI run as the primary cause. Recommends disabling listeners and using -l flag for output.",
48
+ "files": [],
49
+ "assertions": [
50
+ {
51
+ "id": "listener-root-cause",
52
+ "text": "Identifies enabled listeners (View Results Tree, Aggregate Report etc.) in non-GUI runs as the memory leak cause"
53
+ },
54
+ {
55
+ "id": "disable-listeners",
56
+ "text": "Recommends disabling listeners in the test plan for CI runs"
57
+ },
58
+ {
59
+ "id": "jtl-output",
60
+ "text": "Mentions using -l results.jtl flag as the correct output method for non-GUI runs"
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "id": 4,
66
+ "prompt": "We're migrating our load tests from LoadRunner to k6. What does a VuGen Action map to in k6, and what about think time and correlation?",
67
+ "expected_output": "Maps VuGen Action → k6 default() function. Maps lr_think_time() → sleep(). Maps web_reg_save_param → res.json() or regex extraction.",
68
+ "files": [],
69
+ "assertions": [
70
+ {
71
+ "id": "action-mapping",
72
+ "text": "Maps VuGen Action() specifically to k6 default() function"
73
+ },
74
+ {
75
+ "id": "think-time-mapping",
76
+ "text": "Maps lr_think_time() to k6 sleep()"
77
+ },
78
+ {
79
+ "id": "correlation-mapping",
80
+ "text": "Maps web_reg_save_param or LoadRunner correlation to k6 res.json() or regex extraction"
81
+ }
82
+ ]
83
+ },
84
+ {
85
+ "id": 5,
86
+ "prompt": "I'm writing a k6 script for an e-commerce checkout flow: login → browse → add to cart → checkout. Should I use shared-iterations or per-vu-iterations?",
87
+ "expected_output": "Recommends per-vu-iterations. Explains that shared-iterations causes VUs to skip steps in multi-step journeys, producing incorrect metrics.",
88
+ "files": [],
89
+ "assertions": [
90
+ {
91
+ "id": "correct-executor",
92
+ "text": "Recommends per-vu-iterations for the user journey"
93
+ },
94
+ {
95
+ "id": "shared-iterations-problem",
96
+ "text": "Explains why shared-iterations is wrong for journeys — VUs race for iterations and may skip steps"
97
+ },
98
+ {
99
+ "id": "not-ambiguous",
100
+ "text": "Gives a clear recommendation, not a 'it depends' answer without a conclusion"
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "id": 6,
106
+ "prompt": "My Locust test shows zero failures even though I can see 404 and 500 errors in the server logs during the test run.",
107
+ "expected_output": "Identifies missing catch_response=True as the cause. Without it, Locust counts all HTTP responses as success regardless of status code.",
108
+ "files": [],
109
+ "assertions": [
110
+ {
111
+ "id": "catch-response-cause",
112
+ "text": "Identifies missing catch_response=True as the root cause"
113
+ },
114
+ {
115
+ "id": "failure-call",
116
+ "text": "Explains that r.failure() must be called explicitly inside the catch_response context manager"
117
+ },
118
+ {
119
+ "id": "code-example",
120
+ "text": "Provides a corrected code snippet using catch_response=True"
121
+ }
122
+ ]
123
+ },
124
+ {
125
+ "id": 7,
126
+ "prompt": "What are good starting threshold values for a REST API and a checkout payment endpoint in k6?",
127
+ "expected_output": "Provides differentiated thresholds: REST API p95<500ms, checkout p95<1000ms with stricter error rate. Includes both http_req_duration and http_req_waiting. Notes these are baselines to adjust.",
128
+ "files": [],
129
+ "assertions": [
130
+ {
131
+ "id": "differentiated-thresholds",
132
+ "text": "Gives different threshold values for REST API vs checkout — not the same value for both"
133
+ },
134
+ {
135
+ "id": "http-req-waiting",
136
+ "text": "Includes http_req_waiting as a separate threshold alongside http_req_duration"
137
+ },
138
+ {
139
+ "id": "checks-threshold",
140
+ "text": "Includes checks: rate>0.99 threshold"
141
+ },
142
+ {
143
+ "id": "adjust-caveat",
144
+ "text": "Notes that values are baselines and should be adjusted to actual SLA requirements"
145
+ }
146
+ ]
147
+ }
148
+ ]
149
+ }