plugins/adobe-cja/skills/cja-dimension-analysis/SKILL.md
Comprehensive dimension analysis and reporting for CJA. Use this skill whenever the user wants to analyze one or more dimensions — including cardinality, distribution/skew, trends, anomalies, data quality errors, comparisons, and forecasting. Also trigger when someone asks "what are the top values for...", "dimension health", "explore this dimension", "dimension dashboard", "dimension statistics", "data quality check on a dimension", "dimension cardinality", "dimension trends", "dimension skew", "dimension anomalies", "compare dimensions", or any similar request to understand what's inside a CJA dimension. Produces an interactive HTML dashboard or a markdown report. Works with the CJA MCP server.
npx skillsauth add adobe/skills cja-dimension-analysisInstall 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.
Analyze one or more CJA dimensions to understand their cardinality, distribution, trends, anomalies, data quality issues, and forecasts. Produces an actionable report that helps teams understand what's inside their dimensions and where to focus attention.
Execute phases in order. Each phase is selectable — the user can ask for a subset (e.g., "just cardinality and errors") or the full analysis. Default is all phases.
findDataViews to list available data views. If the user hasn't specified one,
ask which data view to analyze. Set it with setDefaultSessionDataViewId.For each dimension:
searchDimensionItems(dimensionId, limit: 50000) to estimate unique value count,
or runReport with the dimension as rows and a count metric to get row count.runReport with dimension + date breakdown;
count unique dimension values per day/week to see cardinality growth trend.Store: {dimensionId, name, uniqueValueCount, cardinalityLevel, cardinalityTrend}
For each dimension:
runReport with dimension as rows + primary metric (e.g., occurrences/visits).
Request at least 50 rows to capture the distribution shape.Store: {dimensionId, distribution: [{value, metric, pct, cumulative}], gini, skewLabel, top1Pct, top5Pct, top10Pct}
For each dimension:
runReport with dimension + date granularity (day or week depending on range).
Compare two periods: first half vs second half of the selected date range.Store: {dimensionId, periodComparison: {period1, period2, changes: [{value, p1Metric, p2Metric, pctChange, badge}]}, newValues: [], disappearedValues: []}
For each dimension:
Store: {dimensionId, anomalies: [{value, date, type, magnitude, zScore}]}
For each dimension:
searchDimensionItems:
"Unspecified", "None", "(empty)", "", "null", "undefined", "N/A", "unknown"runReport filtering to each known bad value.Store: {dimensionId, errorPatterns: [{pattern, count, pct}], missingDataPct, missingDataSeverity}
This phase runs when the user is analyzing 2+ dimensions OR requests period comparison.
Side-by-side (2–3 dimensions):
Time-period comparison (single dimension):
Store: {comparisons: [{type, dimensions or periods, table}]}
For each dimension with sufficient time-series data (>= 7 data points):
Store: {dimensionId, forecasts: [{value, slope, r2, direction, confidence, projectedValues: []}]}
After all analysis phases complete:
Save all collected data to a JSON file:
dimension_analysis_results_YYYY-MM-DD_HH-MM.json
(in a temp output directory, e.g. /tmp/cja-dimension-analysis/, or a path the user specifies)
Run the Python report generator:
python3 scripts/cja_dimension_analysis.py \
<analysis_json> \
"<data_view_name>" \
"<data_view_id>" \
[output_directory] \
[--format=html|markdown] \
[--keep-analyses=N]
Options:
--format=html (default): Interactive HTML dashboard with Chart.js visualizations--format=markdown: Comprehensive text-based report with tables--keep-analyses=N (default: 0 = keep all): Auto-cleanup of old analysis filesThe script generates a second output file: the report (HTML or markdown).
Open with open <output_directory>/dimension_analysis_report_*.html
Present the report path to the user and summarize key findings:
| Tool | Phase | Purpose |
|------|-------|---------|
| findDataViews | 0 | List available data views |
| setDefaultSessionDataViewId | 0 | Set active data view for session |
| findDimensions | 0 | Discover dimensions by name/search |
| describeDimension | 0 | Get dimension metadata and ID |
| searchDimensionItems | 1, 5 | Count unique values; search for specific items (error patterns) |
| runReport | 1–7 | Primary data engine: dimension rows + metric, with optional date breakdown |
Interactive report with:
The generated HTML must use the editorial design system shared across all skills: warm off-white surface, serif display title, red-on-black gradient header, and underline-on-hover text-link nav. Do not introduce corporate-blue chrome, centered headers, or alternative gradients.
Read template.html and use it verbatim. It contains the
Google Fonts <link> tags, the full CSS block, and the <header> structure.
Paste the <head> block into the generated report's <head>, paste the
<header> block at the top of <body>, and fill in the {ORG_NAME},
{DIMENSION_COUNT}, {DATE_RANGE}, {DATA_VIEW_NAME}, and {DATE}
placeholders. Do not improvise the styling.
Where {ORG_NAME} is the customer's brand name (with technical suffixes like
— Prod, - Demo, MCP, Stage stripped). Never substitute a vendor or
product name into the title. The title is all white — do not color any word red.
For single-dimension reports, replace the h1 with {ORG_NAME} {DIMENSION_NAME} Report.
Section titles — no phase prefix: Section headings in the HTML report must not include the phase number. Use the plain section name only:
Text-based report with:
The JSON schema consumed by scripts/cja_dimension_analysis.py is derived from the
Store: {...} shapes in each phase above. The script knows its own input contract;
build the JSON to match the per-phase Store entries.
"Can you analyze how our 'Marketing Channel' dimension is performing and break it down by device type?"
findDataViews. Call setDefaultSessionDataViewId.findDimensions to locate the 'Marketing Channel' dimension and its ID. Confirm it exists and has data with searchDimensionItems.runReport for Marketing Channel performance over the last 30 days (visits, conversions, revenue). Identify top and bottom performers.runReport times out on a dimension, reduce the row limit and note the limitation.tools
Use the run-workflow MCP to discover, compose, execute, publish, and save Adobe Firefly workflows. TRIGGER when: user asks what actions are available, what the MCP can do, how to process images/video/3D via workflow, wants to build/run/save/publish a workflow, OR pastes any workflow/batch/execution ID. BARE ID (UUID/workflowId/batchId) = INSPECT ONLY — call inspect_run, NEVER run_workflow_submit. ALWAYS call list_actions first for capability/discovery questions. DO NOT TRIGGER for direct Firefly API calls without MCP (use firefly-api-specs).
tools
Run predefined featured workflows via run-workflow MCP. TRIGGER when user names a featured workflow (retargeting, banners at scale, localization, packaging, banner advertising, etc.) or asks to run a known marketing/production workflow. Requires run-workflow MCP. ALWAYS call get_featured_workflow before compose_workflow. DO NOT TRIGGER for custom one-off workflows with no named template — use run-workflow skill.
tools
Migrate an Adobe Commerce App Builder project from the Integration Starter Kit or Checkout Starter Kit to the new App Management approach. Run from the root of the App Builder project to be migrated. Pass --auto to skip confirmation prompts (suitable for CI or batch use) — auto mode prints a summary of all Q&A questions answered with their defaults. Pass --doc-scan-only to scan README.md and env.dist for outdated content without modifying any files. Use when the user wants to migrate an App Builder project from the Integration Starter Kit or Checkout Starter Kit to the App Management approach, or mentions upgrading their Adobe Commerce extension architecture.
development
Add or modify webhook interceptors in an Adobe Commerce app. Use when the user wants to intercept Commerce operations to validate input, append data, or modify behavior — before or after execution. Requires a base app initialized with commerce-app-init.