plugins/stardust/skills/audit/SKILL.md
Full three-perspective audit of an existing website from one URL — design (tensions + concrete improvement opportunities), SEO/technical, and LLM/AI-search visibility — plus Core Web Vitals, synthesized into a scored, evidence-bound report. Use when the user asks to "audit this site", "site audit", "design audit", "SEO audit", "why is my site underperforming", "LLM visibility", "how does my site look to AI", or invokes /stardust:audit <url>.
npx skillsauth add adobe/skills 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.
One URL in. One scored, evidence-bound audit out.
audit looks at an existing website from three perspectives — design
(brand tensions + concrete improvement opportunities), SEO/technical,
and LLM/AI-search visibility — measures Core Web Vitals, and
synthesizes everything into a seven-dimension scorecard plus a
prioritized findings ledger that tells the owner what to improve to
generate a better business outcome. The report is also the natural
seed for a redesign: its findings feed stardust:uplift's
improvements list and stardust:direct's Phase 2.5, and it closes
with uplift-shaped redesign directions so "run stardust:uplift" is
the obvious next step.
stardust:extract <url> --cap 8
(home + seven IA pillars) unless --single or --pages overrides.audit.json#assumptions and stated in the report's executive
summary.T-*
tension id, a check result, or a screenshot observation. A claim
with no citation does not ship.not measured (<reason>), never estimated silently.
An estimate, where reasoned, is labeled as one with its basis.<url> — required. The site to audit. A path narrows the crawl to
that subtree (extract's semantics).--pages <n> — optional. Override the default 8-page extraction
cap (passed through as --cap <n>).--single — optional. One-page audit of the given URL only. The
cross-page checks (duplicate titles, sitemap coverage, CTA
fragmentation across pages) then run on a single page and say so.--deploy — optional. After the report renders, publish
report.html as a single self-contained page via the DA transport
(../deploy/da-deploy-protocol.md: source PUT → preview → live)
and print the delivered URL. Transport only — the report never
goes through deploy's section→block conversion, which would
decompose the self-contained file.--benchmark — optional. Force Phase 5 reference benchmarking:
probe the refero MCP even when the earlier capability probe was
slow or ambiguous. Without this flag Phase 5 fires only when the
probe succeeds quickly.There are no other flags. Everything else is derived from the captured surface or governed by the underlying skills' contracts.
../stardust/SKILL.md § Setup) —
with one audit-specific carve-out: impeccable absence is a
degradation here, not the master setup's hard stop. When the
dep check fails, record impeccable: unavailable in
audit.json#degradations and continue — Phase 2 runs without the
critique/audit arms (VISION pass + accessibility fold-in still
fire) and Phase 6 skips the report render; the run ends at stop
condition (b) after audit.json is written.stardust/current/ holds an
extraction of the same origin less than 7 days old —
origin from stardust/state.json (the site record extract
stamped), recency from the newest
pages/<slug>.json#_provenance.fetchedAt — reuse it
and record site.extraction.reused: true. Otherwise invoke
stardust:extract <url> --cap 8 (or --single / --pages <n>
per the inputs). Extract owns the crawl, the screenshots,
_brand-extraction.json, pages/<slug>.json, PRODUCT.md /
DESIGN.md, and brand-review.html with its Tensions section.audit.json#degradations):
marketing-skills plugin (seo-audit, ai-seo skills present?)modern-web-guidance (npx -y modern-web-guidance@latest search "<query>" responds?)mcp__refero__refero_search_styles; treat a
tool-not-found or timeout as unavailable)stardust/rollout/rollout.json present?)If extract fails entirely (site unreachable, bot-management block past the headed-Chrome fallback), stop and surface extract's error verbatim — there is nothing to audit. This is the only hard stop before synthesis; see § Stop conditions.
Read stardust/current/_brand-extraction.json and
stardust/current/brand-review.html § Tensions surfaced (rule
catalog in ../extract/reference/brand-review-template.md
§ Tensions). Every fired T-* tension is candidate evidence for a
finding — carry the ids forward, do not re-derive the detections.
Compute the four brand-expression measurements the report needs.
Each lands in audit.json#measurements with status + method per
reference/report-format.md:
brandColorShare — brand-color share of painted pixels on the
captured home screenshot. Preferred method: Playwright pixel
sampling (method: "pixel-sample") — load the screenshot, sample a
grid (e.g. every 8th pixel), classify each sample to the nearest
palette entry within a tolerance, and divide brand-hue samples by
painted (non-white/near-white) samples. When sampling is infeasible
in the session, a reasoned estimate from the captured surfaces is
allowed but must ship as method: "surface-estimate" with its
basis — never presented as measured.ctaFragmentation — distinct CTA labels per equivalence bucket,
aggregated from pages/*.json#ctas[].label (the same buckets that
drive T-cta-vocab).typeScale — distinct heading sizes and scale kind/ratio from
_brand-extraction.json#type.scaleAudit.radiusSprawl — distinct border-radius values with occurrence
counts from _brand-extraction.json#motifs.borderRadius.Three passes over the captured home page (screenshot + live URL), folded into one set of design findings:
../prototype/SKILL.md § Invoking
impeccable (Skill { skill: "impeccable:impeccable", args: "critique <target>" }, then "audit <target>" for the
accessibility / responsive / performance passes). Normalize its
findings into the audit's finding shape.stardust/current/assets/screenshots/<slug>.png) and name what a
design director would: dated patterns the field has moved past,
hierarchy failures, missed opportunities the captured surface
doesn't capitalize on. The claim discipline is absolute — every
observation cites a measurement, a tension id, or a screenshot
region ("home.png, hero: three equal-weight CTAs compete").
Adjectives without evidence do not become findings.pages/*.json#media.images, landmark presence
and heading order from pages/*.json#landmarks, content-free link
labels (reuse T-link-content-free when fired).When the marketing-skills plugin is installed, follow
marketing-skills:seo-audit's methodology and normalize its
issue/impact/evidence/fix items into findings. When absent, run the
checks directly — they are all curl/Playwright-derivable:
| area | checks | method |
|---|---|---|
| Crawlability | robots.txt present and sane; sitemap declared and valid XML | curl |
| Indexation | canonical present and self-referential; meta robots not accidentally noindex; http→https single-hop redirect; redirect chains | curl -I |
| Semantics | main/nav/footer landmarks; single <h1>; heading hierarchy without skips | pages/.json + Playwright |
| Metadata | title/description presence + quality per page; duplicates across pages; Open Graph completeness | pages/.json#metadata |
| Structured data | JSON-LD presence, parse validity, entity types vs page type | Playwright / curl |
Where a failure matches a rollout:baseline check id
(../rollout/reference/checks.md: single-h1, title-missing,
meta-description, canonical, sitemap, jsonld, img-alt,
landmark-main, duplicate-title), reuse that id as the
finding's evidence.ref (check:<id>) — findings recorded into a
rollout ledger under a known id get picked up by the AEM autofix
registry automatically.
Core Web Vitals. Measure LCP / CLS / TBT via Playwright
performance APIs (PerformanceObserver for
largest-contentful-paint and layout-shift, longtask entries for
TBT) on two viewports: mobile (375×667, CPU throttled where the
session supports it) and desktop (1440×900). When the PageSpeed
Insights API is network-reachable without a key, prefer it and record
method: "psi-api" (it adds field INP); otherwise record
method: "playwright-lab" and say in the measurement note that lab
TBT is a proxy for INP. Classify every metric against the Google
thresholds tabled in reference/scoring.md § performance.
Remediation guidance. When modern-web-guidance is installed,
run npx -y modern-web-guidance@latest search "<specific failure>"
for each distinct failure class and cite the returned guide ids in
the finding's guides[]. When absent, write the generic remediation
and leave guides: [].
When marketing-skills:ai-seo is installed, follow its methodology.
When absent, assess directly:
llms.txt — present at the origin root?h2/h3 map to
askable questions or scannable topics rather than slogans?Every Phase 4 finding names the concrete fix ("state the three price points in the pricing table as text; they currently render only inside the plan-card images"), not a category ("improve content").
Fires when the refero MCP tools are reachable — the Phase 0 probe
attempted mcp__refero__refero_search_styles; --benchmark forces a
re-probe. Skip gracefully when unavailable
(benchmarks: { status: "skipped", reason: … }).
When available: retrieve 2–3 same-vertical reference styles, compare
the audited site's brand expression (Phase 1 measurements) against
what best-in-class in the category does, and cite each reference —
title, URL, one line on what they do better — in the relevant design
findings and in audit.json#benchmarks.references.
Scorecard. Score the seven dimensions per
reference/scoring.md — anchors first, evidence floor enforced,
not-measured dimensions nulled and renormalized. Compute the
weighted overall.
Findings. Consolidate Phases 1–5 into the prioritized ledger:
P1 (actively losing business or excluding users) / P2 (material
drag) / P3 (polish). Per finding: dimension, evidence
(measurement / tension / screenshot / check / benchmark citation),
businessImpact one-liner, concrete fix, guides[].
Uplift directions. Close with 2–3 redesign directions framed
exactly like uplift's variant role contract
(../uplift/SKILL.md § The three-variant role contract):
A faithful + fixes (names the findings it resolves), B one
captured-but-underused trait amplified, C cinematic (motion as
identity, register suggested per
../prototype/reference/motion-registers.md § Selection
heuristic). Drop B when the captured surface can't support a
differentiated middle — two strong directions beat three weak
ones.
Write stardust/audit/<domain-slug>/audit.json — schema,
slug convention, and measurement rules in
reference/report-format.md Part 1. Provenance _provenance
first key.
Render stardust/audit/<domain-slug>/report.html by
delegating to $impeccable craft with the brief in
reference/report-format.md Part 2 — the same Skill-tool
mechanic as prototype, and the same rule: never hand-template
the report. Run the post-render validation checklist; on
failure re-invoke craft with the specific violation. Open the
result with open stardust/audit/<domain-slug>/report.html.
Ledger recording (rollout projects only). When
stardust/rollout/rollout.json exists, record each finding into
the delivery ledger via
node skills/rollout/scripts/findings.mjs record with source
namespace audit: — --source audit:<dimension>, --layer from
the mapping below, severity carried through, --fixability
normalized per ../rollout/reference/audit-sources.md
§ Recording an external finding. Write each returned id into the
finding's ledgerId.
| audit dimension | ledger layer |
|---|---|
| brand-expression | brand-tensions |
| visual-hierarchy-craft | design-ux |
| conversion-focus | content-conversion |
| accessibility | accessibility |
| technical-seo | seo (site-wide: cross-page) |
| content-llm-visibility | ai-search |
| performance | seo |
--deploy. When passed, publish report.html via the DA
transport per ../deploy/da-deploy-protocol.md — PUT the file as
a single source, POST preview, POST live, verify the delivered
URL returns 200 — and print the delivered URL. Transport only;
never run deploy's section→block conversion on the report.
Chat summary. Short — the work is on disk and openable:
audit complete — <url>
Site health: <overall>/100
<dimension>: <score> × 7 (not-measured dimensions listed with reasons)
Findings: <n> P1 · <n> P2 · <n> P3
Top lever: <the single highest-impact P1, one line>
Report: stardust/audit/<domain-slug>/report.html
Data: stardust/audit/<domain-slug>/audit.json
Next: run stardust:uplift <url> — the report's closing directions
are its variant briefs.
Probed once in Phase 0; every degradation is recorded in
audit.json#degradations and rendered in the report's methodology
appendix. None of these stops the audit.
| capability absent | behavior |
|---|---|
| refero MCP | skip Phase 5; benchmarks.status: "skipped" with reason |
| marketing-skills | run the Phase 3 / Phase 4 checks directly (tabled above) |
| modern-web-guidance | generic remediation text; guides: [] |
| PageSpeed Insights | Playwright-only lab metrics; measurement note says lab TBT proxies INP |
| Playwright pixel sampling infeasible | brandColorShare ships as method: "surface-estimate" with basis |
| rollout project | no ledger recording; ledgerId: null on every finding |
not measured (<reason>) in both artifacts. Estimates are labeled
with method + basis. This is the same discipline extract enforces
against synthesis (../extract/SKILL.md § Failure modes) —
fabricated audit numbers are worse than missing ones because they
are actionable-looking and wrong.T-* tension id, a screenshot region, a
check id, or a benchmark URL. Uncited claims are cut in synthesis.report.html is authored by
$impeccable craft against the brief in
reference/report-format.md, validated afterward — never
hand-templated, never hand-patched.../stardust/reference/artifact-map.md § Provenance shapes.uplift (page redesign),
direct Phase 2.5 (improvements list), and rollout's optimize
loop (platform autofix). Audit names the fix; it never edits the
site.Stop and surface only if:
(a) Extract fails entirely — site unreachable, structure
unparseable, bot-management block past the headed-Chrome
fallback. Surface extract's error verbatim; nothing to audit.
(b) impeccable unavailable — Phase 2's critique/audit arms and
Phase 6's report render require it. Per the Phase 0 carve-out,
the run continues in degraded mode (VISION pass, SEO/technical,
LLM visibility, benchmarks all still fire) and writes
audit.json; then stop and tell the user the designed report
needs the impeccable plugin — deliver the data, not a
hand-templated substitute.
Everything else degrades per the ladder; the audit never stops for confirmation in normal flow.
stardust/
├── current/ ← from extract (reused when <7 days old)
│ ├── _brand-extraction.json
│ ├── brand-review.html ← Tensions section = Phase 1 input
│ ├── pages/<slug>.json
│ └── assets/screenshots/<slug>.png ← VISION-pass + report evidence figures
└── audit/
└── <domain-slug>/ ← hostname, www-stripped, dots → dashes
├── audit.json ← scorecard, measurements, findings[], provenance
└── report.html ← craft-rendered, self-contained
stardust/rollout/optimize/findings.json ← appended via findings.mjs (rollout projects only)
Audit writes no state.json entries — extraction state belongs to
extract; audit's own artifacts are self-describing via provenance.
Re-running audit against a fresh extraction overwrites
stardust/audit/<domain-slug>/; ledger recordings dedupe by the
ledger's own id hash.
stardust:uplift <url> (the closing
directions are its variant briefs), stardust:direct (findings
feed the Phase 2.5 improvements list), rollout's optimize loop
(ledger findings with known check ids autofix on AEM).reference/scoring.md — the seven dimensions, weights, observable
anchors at 40/70/90, scoring procedure.reference/report-format.md — audit.json schema (Part 1) and
the report.html craft brief + post-render validation (Part 2).../extract/SKILL.md — crawl, capture, brand-surface extraction;
§ Failure modes for the anti-synthesis discipline.../extract/reference/brand-review-template.md § Tensions — the
T-* detector catalog Phase 1 carries forward.../prototype/SKILL.md § Invoking impeccable — the Skill-tool
delegation mechanic reused for critique (Phase 2) and the report
render (Phase 6).../rollout/reference/audit-sources.md — the findings-ledger
normalization rules (severity, fixability) Phase 6 applies.../rollout/reference/checks.md — baseline check ids to reuse so
AEM autofix picks the findings up.../rollout/scripts/findings.mjs — the ledger writer (record).../uplift/SKILL.md § The three-variant role contract — the frame
for the closing uplift directions.../prototype/reference/motion-registers.md § Selection heuristic
— register suggestion for direction C.../direct/SKILL.md § Phase 2.5 — the improvements list audit
findings feed on a subsequent redesign.../deploy/da-deploy-protocol.md — the DA transport behind
--deploy (source PUT → preview → live; no block conversion).../stardust/SKILL.md § Setup — master-skill setup run in Phase 0.../stardust/reference/artifact-map.md — provenance shapes.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.