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
Identifies which items (pages, campaigns, products, channels, regions) had the biggest increases or decreases for a key metric between two time periods. Use this skill when someone asks "what's up and what's down," "which campaigns moved the most," "top gainers and losers," "what pages are trending," "show me what changed by channel," or any variation of identifying the biggest movers and decliners for a metric.
tools
Compares the performance of two or more audience segments across key metrics side by side. Use this skill when someone wants to compare audiences, cohorts, or groups — for example, "how do mobile users compare to desktop users on conversion," "compare new vs. returning visitors," "show me the difference between these two segments," "compare these audiences on our KPIs," or "which segment performs better." Also trigger for "segment comparison," "audience comparison," or "cohort comparison."
business
Produces a compact KPI digest showing how key metrics changed over a period and what's driving the movement. Use this skill when someone asks for a performance summary, a weekly recap, a morning briefing, a KPI update, or any variation of "how did we do this week/month." Also trigger for requests like "give me a performance overview," "what moved in the last 7 days," "pull our KPI report," or "summarize our metrics."
testing
Analyzes a multi-step conversion funnel to find where users drop off and which steps have the worst leakage. Use this skill when someone describes a journey or funnel and asks about conversion rates, drop-off, fallout, or step completion. Trigger for phrases like "analyze our onboarding funnel," "where are users dropping off," "what's our checkout conversion rate," "funnel analysis," "show me fallout between these steps," or "which step loses the most users."