stardust:audit
One URL in. One scored, evidence-bound audit out.
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
's
improvements list and
's Phase 2.5, and it closes
with uplift-shaped redesign directions so "run
" is
the obvious next step.
Opinionated defaults
- Multi-page by default —
stardust:extract <url> --cap 8
(home + seven IA pillars) unless or overrides.
- Non-interactive — the audit never asks questions. Every
assumption it makes instead is recorded in
and stated in the report's executive
summary.
- Evidence-bound — every claim cites a measurement, a
tension id, a check result, or a screenshot observation. A claim
with no citation does not ship.
- No fabricated data — a measurement that could not be taken is
reported as , never estimated silently.
An estimate, where reasoned, is labeled as one with its basis.
- Graceful degradation, not failure — optional capabilities
(refero, marketing-skills, modern-web-guidance, PageSpeed
Insights) are probed once and their absence is recorded, never
fatal. See § Degradation ladder.
Inputs
- — required. The site to audit. A path narrows the crawl to
that subtree (extract's semantics).
- — optional. Override the default 8-page extraction
cap (passed through as ).
- — 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.
- — optional. After the report renders, publish
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.
- — 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.
Phase 0 — Setup
- Run the master skill's setup ( § 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 in
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 is written.
- Extraction freshness check. If holds an
extraction of the same origin less than 7 days old —
origin from (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 /
per the inputs). Extract owns the crawl, the screenshots,
, , /
, and with its Tensions section.
- Probe optional capabilities once, recording each outcome in
the degradation record ():
- plugin (, skills present?)
- (
npx -y modern-web-guidance@latest search "<query>"
responds?)
- refero MCP (attempt
mcp__refero__refero_search_styles
; treat a
tool-not-found or timeout as unavailable)
- PageSpeed Insights API (network-reachable without a key?)
- rollout project (
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.
Procedure
Phase 1 — Brand surface & tension analysis
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
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
with
+
per
reference/report-format.md
:
- — brand-color share of painted pixels on the
captured home screenshot. Preferred method: Playwright pixel
sampling () — 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.
- — distinct CTA labels per equivalence bucket,
aggregated from
pages/*.json#ctas[].label
(the same buckets that
drive ).
- — distinct heading sizes and scale kind/ratio from
_brand-extraction.json#type.scaleAudit
.
- — distinct border-radius values with occurrence
counts from
_brand-extraction.json#motifs.borderRadius
.
Phase 2 — Design & experience critique
Three passes over the captured home page (screenshot + live URL),
folded into one set of design findings:
- impeccable critique + audit. Invoke via the Skill tool using
the delegation mechanic in § Invoking
impeccable (
Skill { skill: "impeccable:impeccable", args: "critique <target>" }
, then for the
accessibility / responsive / performance passes). Normalize its
findings into the audit's finding shape.
- VISION pass. Study the captured screenshots directly
(
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 (", hero: three equal-weight CTAs compete").
Adjectives without evidence do not become findings.
- Accessibility fold-in. Contrast computed (WCAG ratios for the
captured palette pairs in the roles they are actually used in),
alt coverage from
pages/*.json#media.images
, landmark presence
and heading order from , content-free link
labels (reuse when fired).
Phase 3 — SEO & technical
When the
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 | present and sane; sitemap declared and valid XML | curl |
| Indexation | canonical present and self-referential; not accidentally ; http→https single-hop redirect; redirect chains | curl -I |
| Semantics | // landmarks; single ; 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
check id
(
../rollout/reference/checks.md
:
,
,
,
,
,
,
,
,
),
reuse that id as the
finding's
(
) — 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 (
for
and
,
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
(it adds field INP); otherwise record
and say in the measurement note that lab
TBT is a proxy for INP. Classify every metric against the Google
thresholds tabled in
§ performance.
Remediation guidance. When
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
. When absent, write the generic remediation
and leave
.
Phase 4 — LLM visibility
When
is installed, follow its methodology.
When absent, assess directly:
- — present at the origin root?
- Answerability — does each audited page answer the question a
user would ask of it ("what does this cost", "what is this") in
extractable, well-structured prose — and how early on the page?
- schema.org coverage — do the JSON-LD entities cover the
organization plus the page-type entities an answer engine needs
for entity understanding?
- Heading-as-question coverage — what share of / map to
askable questions or scannable topics rather than slogans?
- Content depth — extractable prose word counts on key pages;
specific, citable claims vs thin marketing copy.
- Key facts in crawlable text — are pricing, what-it-is, and
who-it's-for stated in crawlable text, or locked in images and
JS-rendered widgets?
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").
Phase 5 — Reference benchmarking (optional)
Fires when the refero MCP tools are reachable — the Phase 0 probe
attempted
mcp__refero__refero_search_styles
;
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
.
Phase 6 — Synthesis & report
-
Scorecard. Score the seven dimensions per
— 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:
,
(measurement / tension / screenshot / check / benchmark citation),
one-liner, concrete
,
.
-
Uplift directions. Close with 2–3 redesign directions framed
exactly like uplift's variant role contract
(
§ 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
first key.
-
Render stardust/audit/<domain-slug>/report.html
by
delegating to
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
—
--source audit:<dimension>
,
from
the mapping below, severity carried through,
normalized per
../rollout/reference/audit-sources.md
§ Recording an external finding. Write each returned id into the
finding's
.
| audit dimension | ledger layer |
|---|
| |
| |
| |
| |
| (site-wide: ) |
| |
| |
-
. When passed, publish
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.
Degradation ladder
Probed once in Phase 0; every degradation is recorded in
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; |
| PageSpeed Insights | Playwright-only lab metrics; measurement note says lab TBT proxies INP |
| Playwright pixel sampling infeasible | ships as method: "surface-estimate"
with basis |
| rollout project | no ledger recording; on every finding |
Hard constraints
- No fabricated data. A measurement that could not be taken is
in both artifacts. Estimates are labeled
with method + basis. This is the same discipline extract enforces
against synthesis ( § Failure modes) —
fabricated audit numbers are worse than missing ones because they
are actionable-looking and wrong.
- Evidence discipline. Every finding cites observable evidence:
a measurement key, a tension id, a screenshot region, a
check id, or a benchmark URL. Uncited claims are cut in synthesis.
- Report is craft-rendered. is authored by
against the brief in
reference/report-format.md
, validated afterward — never
hand-templated, never hand-patched.
- Provenance is mandatory on both artifacts, per
../stardust/reference/artifact-map.md
§ Provenance shapes.
- Non-interactive. No questions in normal flow; assumptions are
stated in the report. The only stops are the two below.
- Audit does not fix. Fixes belong to (page redesign),
Phase 2.5 (improvements list), and rollout's optimize
loop (platform autofix). Audit names the fix; it never edits the
site.
Stop conditions
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
; 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.
Outputs
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
entries — extraction state belongs to
; 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.
Scope
- Audits and prescribes; never modifies the site or its redesign
artifacts.
- One origin per run. Auditing a competitor set is N runs.
- The natural continuations: (the closing
directions are its variant briefs), (findings
feed the Phase 2.5 improvements list), rollout's optimize loop
(ledger findings with known check ids autofix on AEM).
References
- — the seven dimensions, weights, observable
anchors at 40/70/90, scoring procedure.
reference/report-format.md
— schema (Part 1) and
the craft brief + post-render validation (Part 2).
- — crawl, capture, brand-surface extraction;
§ Failure modes for the anti-synthesis discipline.
../extract/reference/brand-review-template.md
§ Tensions — the
detector catalog Phase 1 carries forward.
- § 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 ().
- § The three-variant role contract — the frame
for the closing uplift directions.
../prototype/reference/motion-registers.md
§ Selection heuristic
— register suggestion for direction C.
- § Phase 2.5 — the improvements list audit
findings feed on a subsequent redesign.
../deploy/da-deploy-protocol.md
— the DA transport behind
(source PUT → preview → live; no block conversion).
- § Setup — master-skill setup run in Phase 0.
../stardust/reference/artifact-map.md
— provenance shapes.