plugins/aem/edge-delivery-services-content-ops/skills/content-audit/SKILL.md
Audit an AEM Edge Delivery Services page for content quality, SEO, accessibility, performance, and EDS best practices. Produces a prioritized fix list with specific remediation steps. Use when reviewing page quality, preparing for launch, or optimizing existing content.
npx skillsauth add adobe/skills content-auditInstall 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 published AEM Edge Delivery Services pages against content quality, SEO, accessibility, performance, and EDS-specific best practices. Produces a prioritized fix list with concrete remediation steps — not vague suggestions.
This skill fetches external web pages for analysis. When fetching:
Before starting, create a checklist of all audit steps to track progress:
.plain.html variantFetch two versions of the target page:
https://example.com/about)..plain.html (e.g., https://example.com/about.plain.html). For root paths (/), use /index.plain.html. This returns the raw authored content without site chrome, navigation, or footer.Also fetch the header and footer fragments, since EDS loads these via JavaScript and they appear as empty elements in the initial HTML:
3. Header content — https://example.com/nav.plain.html
4. Footer content — https://example.com/footer.plain.html
Parse all and note:
.plain.html (headings, paragraphs, tables/blocks, images, links)..plain.html returns a 404, note this as an issue — it may indicate a non-standard page setup.Note: Some tools convert fetched HTML to markdown, which loses HTML attributes (alt text, loading, class names). When auditing attributes like loading="lazy", alt, or CSS classes, use curl or a tool that preserves raw HTML.
Check the following against the .plain.html and published page:
---). In EDS, horizontal rules in the source document create <div> section wrappers. Verify sections are logically separated.columns, cards, hero). Non-standard names should be flagged as P3..plain.html reference excessively large source files.Check the page metadata (in EDS, this is a metadata table at the bottom of the source document, rendered as <meta> tags in the published page):
og:title, og:description, and og:image are present in the rendered <head>. Missing OG tags are P1.<meta name="robots">. If the page is set to noindex or nofollow, flag it as P0 unless the user confirms this is intentional (e.g., staging).<link rel="canonical"> is present and points to the correct URL. Missing canonical is P2.Check EDS-specific performance patterns. Refer to the references/eds-performance-rules.md reference for detailed thresholds.
loading="lazy". Lazy-loading the LCP candidate is P0.fetchpriority="high". Missing fetchpriority on the LCP candidate is P1.aem.js, aem.css) should load eagerly.delayed.js, loading 3+ seconds after LCP. Third-party scripts loading before LCP is P0.@font-face with font-display: swap and size-adjust fallback fonts. Preloading fonts is P1.size-adjust. Check the CSS for fallback font declarations. Missing size-adjust causes CLS. Flag as P1.<img> has an alt attribute. Missing alt is P0 (WCAG 1.1.1).alt="" (empty alt), not a missing attribute.<p> containing <strong> renders as a primary button; <em> renders as a secondary button. Verify buttons follow this pattern. Incorrect button markup is P2.<html lang="..."> attribute is present and correct for the page language. Missing is P1.<title> should be closely related (not necessarily identical). A mismatch is P2..html extension in the URL. EDS serves extensionless URLs. A .html extension in the URL is P1.Check against Adobe's content modeling rules. Refer to references/content-modeling-rules.md for the full 15 rules.
| Rule | What to Check | Priority if Violated |
|------|---------------|---------------------|
| Minimize block usage | Count blocks vs. default content. Is the block-to-content ratio high? | P2 |
| No nested blocks | Does any block table contain another block table? | P0 |
| Constrain table complexity | Are there merged cells or tables exceeding 3 columns? | P1 |
| Fully qualified URLs | Are all URLs absolute (https://...)? Relative URLs break in some contexts. | P1 |
| Clean URL filenames | No trailing slashes, no .html, no special characters | P1 |
| No HTML/CSS/JSON in documents | Is there raw markup embedded in the source content? | P0 |
| Icon syntax | Icons use :iconname: syntax, not inline SVG or img tags | P2 |
| Fragment usage | Are fragments used strategically or overused? | P2 |
| Block sprawl | Does the site have many custom blocks that could be consolidated? | P3 |
| Columns | Are blocks limited to 3 columns or fewer? | P2 |
Produce a summary table of all findings, sorted by priority:
| Priority | Category | Issue | Location | Fix | Impact | |----------|----------|-------|----------|-----|--------| | P0 (Critical) | ... | ... | ... | ... | ... | | P1 (High) | ... | ... | ... | ... | ... | | P2 (Medium) | ... | ... | ... | ... | ... | | P3 (Low) | ... | ... | ... | ... | ... |
After the table, provide:
| Problem | Cause | Solution |
|---------|-------|----------|
| .plain.html returns 404 | Page may use a non-standard path structure or may not be an EDS page | Audit only the published page; note the limitation |
| Cannot fetch the page | Page may be behind authentication or on a private network | Ask the user to provide the page HTML directly |
| Blocks not rendering as expected | Block CSS/JS may not be loaded in .plain.html | Use the published page for visual/structural checks |
| Metadata table not visible | Metadata is stripped from .plain.html output | Check <meta> tags in the published page <head> |
| Performance data unavailable | Cannot run Lighthouse from this context | Note recommendations based on static analysis; suggest the user run Lighthouse separately |
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.