.cursor/skills/report-revision-workflow/SKILL.md
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.
npx skillsauth add canyonlabz/mcp-perf-suite report-revision-workflowInstall 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.
single_run reports and comparison reportsThis section provides context for humans and capable models. For the step-by-step execution instructions, skip to the Execution section below.
Orchestrates the AI-assisted revision of performance test reports using a Human-In-The-Loop (HITL) approach. It enables iterative refinement of report sections through PerfReport MCP tools that work together to discover data, save AI-generated revisions, and assemble the final report.
The workflow phases:
This workflow handles two report types with different section IDs:
Single-Run Report Sections:
| Section ID | Placeholder | Description |
|------------|-------------|-------------|
| executive_summary | {{EXECUTIVE_SUMMARY}} | High-level test outcome summary with key metrics and findings |
| key_observations | {{KEY_OBSERVATIONS}} | Bullet-point observations about test performance and issues |
| issues_table | {{ISSUES_TABLE}} | Table of issues and errors observed during test execution |
| jmeter_log_analysis | {{JMETER_LOG_ANALYSIS}} | JMeter/BlazeMeter log error analysis with categorization, affected APIs, and JTL correlation |
| bottleneck_analysis | {{BOTTLENECK_ANALYSIS}} | Bottleneck identification with degradation thresholds, severity breakdown, and per-endpoint findings |
Comparison Report Sections:
| Section ID | Placeholder | Description |
|------------|-------------|-------------|
| executive_summary | {{EXECUTIVE_SUMMARY}} | Comparison summary across multiple test runs |
| key_findings | {{KEY_FINDINGS_BULLETS}} | Key findings from comparing test runs |
| issues_summary | {{ISSUES_SUMMARY}} | Summary of issues across compared runs |
| overall_trend_summary | {{OVERALL_TREND_SUMMARY}} | Overall performance trend narrative comparing key metrics across test runs |
| correlation_insights_section | {{CORRELATION_INSIGHTS_SECTION}} | Performance-infrastructure correlation analysis across compared runs |
The discover_revision_data tool returns the full list of available sections dynamically.
The tables above reflect the known sections defined in report_config.yaml. Additional
sections may be added in the future.
Key differences between report types:
key_observations and issues_tablekey_findings and issues_summaryoverall_trend_summary and correlation_insights_sectionjmeter_log_analysis and bottleneck_analysisSingle-Run Reports:
artifacts/{run_id}/reports/
├── performance_report_{run_id}.md # Original report
├── performance_report_{run_id}_original.md # Backup (after revision)
├── performance_report_{run_id}_revised.md # AI-revised report
├── report_metadata_{run_id}.json # Metadata
├── report_metadata_{run_id}_original.json # Backup metadata
└── revisions/ # AI revision files
├── AI_EXECUTIVE_SUMMARY_v1.md
├── AI_KEY_OBSERVATIONS_v1.md
└── AI_ISSUES_TABLE_v1.md
Comparison Reports:
artifacts/comparisons/{comparison_id}/
├── comparison_report_*.md # Original report
├── comparison_report_*_original.md # Backup (after revision)
├── comparison_report_*_revised.md # AI-revised report
├── comparison_metadata_*.json # Metadata
├── comparison_metadata_*_original.json # Backup metadata
├── charts/ # Comparison charts
└── revisions/ # AI revision files
├── AI_EXECUTIVE_SUMMARY_v1.md
├── AI_KEY_FINDINGS_BULLETS_v1.md
└── AI_ISSUES_SUMMARY_v1.md
| Tool | Purpose | Key Parameters |
|------|---------|---------------|
| discover_revision_data | Gather data files and revisable sections | run_id, report_type, additional_context (optional) |
| prepare_revision_context | Save AI-generated content for a section | run_id, section_id, revised_content, report_type, additional_context (optional) |
| revise_performance_test_report | Assemble final revised report from saved revisions | run_id, report_type, revision_version (optional) |
| convert_markdown_to_xhtml | Convert revised Markdown to Confluence XHTML | test_run_id, filename, report_type |
| update_page | Publish revised content to Confluence page | page_ref, test_run_id, mode, use_revised, report_type |
additional_context if provided (project name, purpose)When using terms non-technical stakeholders may not understand:
> **Terms:** *CoV* — A measure of response time consistency; values >1.0 indicate high variability.Common terms requiring definition: CoV, P90/P95/P99, SLA, Throughput, Latency vs Response Time, Error Rate, mCPU, Connection Pool.
When generating content for comparison reports, consider:
Example comparison executive summary:
"Analysis of 5 test runs (25-750 VUs) shows stable system performance under increasing load. Throughput scaled linearly from 1.76 to 161.54 req/sec while maintaining 99.98%+ success rate. CPU utilization increased proportionally (220 -> 1040 mCPU) indicating healthy resource scaling."
For single_run reports (read in this order):
artifacts/{run_id}/analysis/performance_analysis.json — Core metricsartifacts/{run_id}/analysis/performance_summary.md — Human-readable summaryartifacts/{run_id}/analysis/infrastructure_analysis.json — Infrastructure metricsartifacts/{run_id}/analysis/correlation_analysis.json — Correlationsartifacts/{run_id}/analysis/bottleneck_analysis.json — Bottleneck analysisartifacts/{run_id}/analysis/<source>_log_analysis.json — Source: "jmeter" or "blazemeter"artifacts/{run_id}/analysis/log_analysis.json — High-level log analysis incl. Datadogartifacts/{run_id}/blazemeter/test_config.json — Test configurationartifacts/{run_id}/reports/performance_report_{run_id}.md — Current reportFor comparison reports (read in this order):
artifacts/comparisons/{comparison_id}/comparison_metadata_*.json — Run IDs and configartifacts/comparisons/{comparison_id}/comparison_report_*.md — Current comparison reportrun_id_list:
artifacts/{run_id}/reports/report_metadata_{run_id}.json — Individual run metricsartifacts/{run_id}/analysis/performance_analysis.json — Detailed metrics per runprerequisites.mdc — test_run_id and artifact structure validationskill-execution-rules.mdc — Follow steps in order, collect inputs first, do not skipmcp-error-handling.mdc — MCP tool error handling (retry policy, reporting format)report_config.yaml before they can be revised. All sections
are disabled by default.prepare_revision_context creates a new version. Previous versions are
preserved for comparison.This is an interactive HITL workflow. Steps 6-7 repeat as many times as needed based on user feedback.
Ask the user for the following values. Do not proceed until all required values are collected.
REQUIRED:
run_id = [test run ID for single_run, or comparison_id for comparison reports]
report_type = ["single_run" (default) or "comparison"]
OPTIONAL:
additional_context = [project name, purpose, feature/PBI details from ADO/JIRA]
sections_to_revise = [user preferences on which sections to revise]
For single_run reports, verify:
artifacts/{run_id}/reports/performance_report_{run_id}.mdartifacts/{run_id}/analysis/report_config.yaml under revisable_sections.single_runFor comparison reports, verify:
artifacts/comparisons/{comparison_id}/comparison_report_*.mdartifacts/comparisons/{comparison_id}/comparison_metadata_*.jsonrun_id_listreport_config.yaml under revisable_sections.comparisonDo not proceed until the original report has been generated.
Action: Create task items to monitor progress:
discover_revision_dataprepare_revision_context (per section)revise_performance_test_reportInput: run_id, report_type, additional_context (optional)
Action: Call MCP tool discover_revision_data
discover_revision_data(
run_id = {run_id},
report_type = {report_type},
additional_context = {additional_context}
)
Expected response:
{
"data_sources": { "blazemeter": [...], "datadog": [...], "analysis": [...], "reports": [...] },
"revisable_sections": [ { "section_id": "...", "enabled": true/false, ... } ],
"enabled_section_count": 3,
"revision_output_path": "artifacts/{run_id}/reports/revisions/",
"existing_revisions": { ... },
"revision_guidelines": "..."
}
Save:
data_sources = file paths organized by MCP sourcerevisable_sections = list of sections with enabled/disabled statusenabled_section_count = number of sections ready for revisionValidation: Verify enabled_section_count > 0. If no sections are enabled, inform
the user to update report_config.yaml:
Location: perfreport-mcp/report_config.yaml
Section: revisable_sections.single_run (or .comparison)
Set enabled: true for desired sections
On error: If the tool fails, check run_id, verify the artifacts folder exists,
and ensure the original report was generated first. Stop and report to user.
Input: data_sources (from Step 2), report_type, additional_context
Action: Read the priority data files listed in the Reference section to build context.
For each enabled section, generate revised content following the AI Content Guidelines in the Reference section:
Single-run sections:
executive_summary — 3-5 sentences, key metrics, critical issueskey_observations — 3-7 bullet points prioritized by impactissues_table — Markdown table sorted by severityjmeter_log_analysis — Error categorization, affected APIs, JTL correlation findingsbottleneck_analysis — Degradation thresholds, severity breakdown, per-endpoint findingsComparison sections:
executive_summary — Overall comparison findings across runskey_findings — Trends and insights, 3-7 bullet pointsissues_summary — Aggregated issues, recurring vs. one-timeoverall_trend_summary — Performance trend narrative across runscorrelation_insights_section — Performance-infrastructure correlation analysisUse the data from the analysis files to produce specific, data-driven content.
Save: generated_content = dict mapping section_id to generated markdown content.
Input: run_id, report_type, generated_content (from Step 3), additional_context
Action: For each enabled section, call MCP tool prepare_revision_context:
prepare_revision_context(
run_id = {run_id},
section_id = {section_id},
revised_content = {content for this section},
report_type = {report_type},
additional_context = {additional_context}
)
Expected response:
{
"section_full_id": "single_run.executive_summary",
"revision_number": 1,
"revision_path": "artifacts/{run_id}/reports/revisions/AI_EXECUTIVE_SUMMARY_v1.md",
"previous_versions": []
}
Repeat for each enabled section returned by discover_revision_data.
Single-run sections:
executive_summary -> save executive summary contentkey_observations -> save key observations contentissues_table -> save issues table contentjmeter_log_analysis -> save JMeter log analysis contentbottleneck_analysis -> save bottleneck analysis contentComparison sections:
executive_summary -> save executive summary contentkey_findings -> save key findings contentissues_summary -> save issues summary contentoverall_trend_summary -> save overall trend summary contentcorrelation_insights_section -> save correlation insights contentOnly process sections where enabled: true in the discovery response.
Save: Track which sections were saved and their version numbers.
On error: If the tool fails, check section_id is valid, content is not empty,
and report_type matches the run_id. Stop and report to user.
Input: run_id, report_type
Action: Call MCP tool revise_performance_test_report
revise_performance_test_report(
run_id = {run_id},
report_type = {report_type},
revision_version = {optional — defaults to latest}
)
The tool:
*_original.md*_original.json*_revised.mdExpected response:
{
"status": "success",
"revised_report_path": "artifacts/{run_id}/reports/performance_report_{run_id}_revised.md",
"backup_report_path": "artifacts/{run_id}/reports/performance_report_{run_id}_original.md",
"sections_revised": ["executive_summary", "key_observations", "issues_table"],
"revision_versions_used": { "executive_summary": 1, "key_observations": 1, "issues_table": 1 },
"warnings": []
}
Save: revised_report_path, sections_revised, revision_versions_used.
Validation: Verify status is "success", sections_revised contains all expected
sections, revised_report_path exists. Review any warnings.
On error: Verify revision files exist in the revisions folder and at least one section is enabled. Stop and report to user.
Input: revised_report_path, sections_revised, revision_versions_used
Action: Present the results to the user:
Ask the user:
If the user is satisfied, go to Step 8. If the user wants changes, go to Step 7.
When: The user requests changes to specific sections.
Collect from the user:
Generate new content for the specified section incorporating the user's feedback.
prepare_revision_context(
run_id = {run_id},
section_id = {section_id},
revised_content = {new content},
report_type = {report_type},
additional_context = {feedback context}
)
The tool automatically increments the version number (e.g., AI_EXECUTIVE_SUMMARY_v2.md).
revise_performance_test_report(
run_id = {run_id},
report_type = {report_type},
revision_version = {optional — specify version or omit for latest}
)
Go back to Step 6 to present the updated report and ask for feedback.
Continue the HITL loop until the user approves the revised report.
Action: Present a final summary to the user.
For single_run reports:
artifacts/{run_id}/reports/performance_report_{run_id}_original.mdartifacts/{run_id}/reports/performance_report_{run_id}_revised.mdartifacts/{run_id}/reports/revisions/artifacts/{run_id}/reports/report_metadata_{run_id}.jsonFor comparison reports:
artifacts/comparisons/{comparison_id}/comparison_report_*_original.mdartifacts/comparisons/{comparison_id}/comparison_report_*_revised.mdartifacts/comparisons/{comparison_id}/revisions/artifacts/comparisons/{comparison_id}/comparison_metadata_*.json| Section | Versions Created | Final Version Used | |---------|------------------|-------------------| | executive_summary | v1, v2 | v2 | | key_observations | v1 | v1 | | issues_table | v1 | v1 | | jmeter_log_analysis | v1 | v1 | | bottleneck_analysis | v1 | v1 |
Ask the user:
create_chart from PerfReport MCP..cursor/skills/comparison-report-workflow/SKILL.md.When: The user wants to publish the revised report to an existing Confluence page.
Prerequisites:
*_revised.md)page_ref (page ID) from the initial publish is availableconfluence_mode = "cloud" or "onprem"For single_run reports:
convert_markdown_to_xhtml(
test_run_id = {run_id},
filename = "performance_report_{run_id}_revised.md",
report_type = "single_run"
)
For comparison reports:
convert_markdown_to_xhtml(
test_run_id = {comparison_id},
filename = "comparison_report_{ids}_revised.md",
report_type = "comparison"
)
This creates a *_revised.xhtml file in the reports folder.
For single_run reports:
update_page(
page_ref = {page_ref},
test_run_id = {run_id},
mode = {confluence_mode},
use_revised = true,
report_type = "single_run"
)
For comparison reports:
update_page(
page_ref = {page_ref},
test_run_id = {comparison_id},
mode = {confluence_mode},
use_revised = true,
report_type = "comparison"
)
The update_page tool with use_revised=true:
*_revised.xhtml file (not the main XHTML)<ac:image> markup*_revised_with_images.xhtml file for referenceImages are already attached from the initial publish. Only placeholder substitution and page content update are needed.
Verify:
"used_revised": truexhtml_source field shows the *_revised.xhtml filenameplaceholders_replaced)On error: If API calls fail, retry up to 3 times. Report error to user.
These rules apply to every step:
testing
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).
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.