.cursor/skills/subagent-orchestrator/SKILL.md
Orchestrates BlazeMeter and Datadog data extraction using dedicated subagents. Use when the user mentions subagent workflow, subagent orchestrator, or wants to run the BlazeMeter and Datadog extraction phases via subagents. This skill handles the extraction and handoff phases only — it does NOT run PerfAnalysis, PerfReport, or Confluence. After this skill completes, the user can continue with the performance-testing-workflow skill starting from Step 4 (PerfAnalysis).
npx skillsauth add canyonlabz/mcp-perf-suite subagent-orchestratorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
blazemeter-extractor subagent to populate artifacts/{test_run_id}/blazemeter/test_config.json (fallback)datadog-extractor subagent to populate artifacts/{test_run_id}/datadog/orchestrator_manifest.json with execution resultsAfter this skill completes, the user can continue with the
performance-testing-workflow skill starting from Step 4 (PerfAnalysis).
User Prompt (test_run_id, env_name, ...)
│
▼
Orchestrator (this skill)
│
├── blazemeter-extractor subagent
│ └── artifacts/{test_run_id}/blazemeter/
│ ├── test-results.csv
│ ├── aggregate_performance_report.csv
│ ├── test_config.json
│ ├── jmeter.log (or jmeter-*.log)
│ ├── public_report.json
│ ├── sessions/session_manifest.json
│ └── subagent_manifest.json
│
├── [extract start_time / end_time]
│
├── datadog-extractor subagent
│ └── artifacts/{test_run_id}/datadog/
│ ├── host_metrics_*.csv or k8s_metrics_*.csv
│ ├── logs_*.csv
│ ├── apm_traces_*.csv (if traces exist)
│ ├── kpi_metrics_*.csv (if requested)
│ └── subagent_manifest.json
│
└── orchestrator_manifest.json
└── artifacts/{test_run_id}/orchestrator_manifest.json
mcpServers YAML field: Confirmed that Cursor does NOT enforce the mcpServers
field in subagent frontmatter. Both subagents see all configured MCP servers. Tool
isolation is enforced via prompt-level instructions in each subagent's system prompt.
The mcpServers field is retained in the YAML for forward compatibility and for
Claude Code users where it IS enforced.
Follow these steps exactly, in order.
Ask the user for the following values. Do not proceed until all required values are collected.
REQUIRED:
test_run_id = [BlazeMeter test run ID — e.g., "12345678"]
env_name = [Datadog environment name — e.g., "QA", "UAT"]
OPTIONAL:
test_name = [informational label for the test run]
log_query_type = [Datadog log query type — default: "all_errors"]
apm_query_type = [Datadog APM query type — default: "all_errors"]
kpi_query_names = [list of KPI query group keys — default: none]
Create task items to monitor progress:
Action: Invoke the blazemeter-extractor subagent with the following prompt:
Extract BlazeMeter test results for test_run_id: {test_run_id}.
{Include test_name if provided: "Test name: {test_name}"}
Follow all instructions in your system prompt including writing the
subagent_manifest.json file.
After the subagent returns:
status, start_time, end_time, and notesSave:
bz_status = parsed status valuebz_start_time = parsed start_time value (may be null)bz_end_time = parsed end_time value (may be null)bz_return_json = the full parsed JSON objectIf bz_status is "failed", warn the user but continue to Step 4 to attempt the
fallback timestamp mechanism.
This step uses two approaches for getting timestamps. Record results for both.
Check if bz_start_time and bz_end_time from Step 3 are non-null and valid ISO 8601.
Record:
primary_handoff_success = true/falseprimary_start_time = value or nullprimary_end_time = value or nullAttempt to read artifacts/{test_run_id}/blazemeter/test_config.json.
If the file exists, extract start_time and end_time from it.
Note: The test_config.json format may differ from ISO 8601 (e.g.,
"2026-02-26 07:42:33 UTC" instead of "2026-02-26T07:42:33Z"). Normalize to
ISO 8601 before passing to Datadog if using the fallback.
Record:
fallback_file_exists = true/falsefallback_start_time = value or nullfallback_end_time = value or nullUse the primary approach values if available. Fall back to the file-based values if the primary approach returned null. If both are null, record the failure.
Record:
effective_start_time = the value that will be passed to Datadogeffective_end_time = the value that will be passed to Datadogtimestamp_source = "subagent_return" or "test_config_file" or "none"If timestamp_source is "none", warn the user that Datadog extraction cannot
proceed without timestamps. Stop and report the failure.
Action: Invoke the datadog-extractor subagent with the following prompt:
Extract Datadog metrics for the following test run:
test_run_id: {test_run_id}
env_name: {env_name}
start_time: {effective_start_time}
end_time: {effective_end_time}
{Include if provided: "log_query_type: {log_query_type}"}
{Include if provided: "apm_query_type: {apm_query_type}"}
{Include if provided: "kpi_query_names: {kpi_query_names}"}
Follow all instructions in your system prompt including writing the
subagent_manifest.json file.
After the subagent returns:
status, env_type, and notesSave:
dd_status = parsed status valuedd_return_json = the full parsed JSON objectWrite artifacts/{test_run_id}/orchestrator_manifest.json with the following structure:
{
"orchestrator": "subagent-orchestrator",
"orchestrator_version": "1.0.0",
"test_run_id": "<test_run_id>",
"env_name": "<env_name>",
"execution_timestamp": "<ISO 8601 UTC>",
"subagents": {
"blazemeter": {
"invocation_success": "<true | false>",
"return_json_parsed": "<true | false>",
"return_json": "<full bz_return_json or null>",
"subagent_manifest_exists": "<true | false — check artifacts/{test_run_id}/blazemeter/subagent_manifest.json>"
},
"timestamp_handoff": {
"primary_approach": {
"source": "subagent_return",
"success": "<true | false>",
"start_time": "<value or null>",
"end_time": "<value or null>"
},
"fallback_approach": {
"source": "test_config_file",
"file_exists": "<true | false>",
"success": "<true | false>",
"start_time": "<value or null>",
"end_time": "<value or null>"
},
"effective_source": "<subagent_return | test_config_file | none>",
"effective_start_time": "<value or null>",
"effective_end_time": "<value or null>"
},
"datadog": {
"invocation_success": "<true | false>",
"return_json_parsed": "<true | false>",
"return_json": "<full dd_return_json or null>",
"subagent_manifest_exists": "<true | false — check artifacts/{test_run_id}/datadog/subagent_manifest.json>"
}
},
"artifact_validation": {
"blazemeter_folder_exists": "<true | false>",
"blazemeter_files": {
"test_results_csv": "<true | false>",
"aggregate_performance_report_csv": "<true | false>",
"test_config_json": "<true | false>",
"jmeter_log": "<true | false>",
"session_manifest_json": "<true | false>",
"public_report_json": "<true | false>"
},
"datadog_folder_exists": "<true | false>",
"datadog_files": {
"infrastructure_metrics_csv": "<true | false>",
"logs_csv": "<true | false>",
"apm_traces_csv": "<true | false>",
"kpi_metrics_csv": "<true | false | not_applicable>"
}
},
"overall_assessment": {
"blazemeter_extraction": "success | partial | failed | not_attempted",
"datadog_extraction": "success | partial | failed | not_attempted",
"ready_for_perfanalysis": "<true | false>"
}
}
Present a clear summary to the user:
BlazeMeter Subagent Results
artifacts/{test_run_id}/blazemeter/Timestamp Handoff Results
Datadog Subagent Results
artifacts/{test_run_id}/datadog/Overall Assessment
Manifest Locations
artifacts/{test_run_id}/orchestrator_manifest.jsonartifacts/{test_run_id}/blazemeter/subagent_manifest.jsonartifacts/{test_run_id}/datadog/subagent_manifest.jsonNext Steps
performance-testing-workflow
skill starting from Step 4 (PerfAnalysis) to complete the pipeline.raw_response field..cursor/skills/performance-testing-workflow/SKILL.md.cursor/agents/blazemeter-extractor.md.cursor/agents/datadog-extractor.md.cursor/rules/mcp-error-handling.mdc.cursor/rules/skill-execution-rules.mdc.cursor/rules/prerequisites.mdctesting
AI-assisted HITL revision of performance test reports with iterative refinement, version tracking, and optional Confluence publishing. Use when the user mentions report revision, AI-enhanced report, revise executive summary, revise key observations, revise issues table, or improve a performance report.
tools
Run Playwright browser automation to capture network traffic and generate a JMeter JMX script. Use when the user mentions browser automation, Playwright recording, test spec execution, browser-based network capture, or generating a JMeter script from a live browser session.
tools
End-to-end performance testing pipeline orchestrating BlazeMeter, Datadog, PerfAnalysis, PerfReport, and Confluence MCP workflows sequentially. Use when the user mentions performance testing workflow, E2E pipeline, BlazeMeter results, test run analysis, performance report generation, or end-to-end test processing.
development
Manage the PerfMemory lessons-learned layer — search for past fixes before debugging, store debug sessions and attempts during debugging, and ingest existing knowledge from debug manifests or lessons-learned documents. Use when the user mentions perfmemory, lessons learned, debug memory, ingesting debug manifests, or searching for past fixes.