stardust:audit
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.
Opinionated defaults
- Multi-page by default —
stardust:extract <url> --cap 8
(home + seven IA pillars) unless --single or --pages overrides.
- Non-interactive — the audit never asks questions. Every
assumption it makes instead is recorded in
audit.json#assumptions and stated in the report's executive
summary.
- Evidence-bound — every claim cites a measurement, a
T-*
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
not measured (<reason>), 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
<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.
Phase 0 — Setup
- Run the master skill's setup (
../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.
- Extraction freshness check. If
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.
- Probe optional capabilities once, recording each outcome in
the degradation record (
audit.json#degradations):
marketing-skills plugin (seo-audit, ai-seo skills present?)
modern-web-guidance (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 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.
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
../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.
- 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 ("home.png, 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 pages/*.json#landmarks, content-free link
labels (reuse T-link-content-free when fired).
Phase 3 — SEO & technical
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: [].
Phase 4 — LLM visibility
When marketing-skills:ai-seo is installed, follow its methodology.
When absent, assess directly:
llms.txt — 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
h2/h3 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; --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.
Phase 6 — Synthesis & report
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.
Degradation ladder
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 |
Hard constraints
- No fabricated data. A measurement that could not be taken is
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.
- Evidence discipline. Every finding cites observable evidence:
a measurement key, a
T-* tension id, a screenshot region, a
check id, or a benchmark URL. Uncited claims are cut in synthesis.
- Report is craft-rendered.
report.html is authored by
$impeccable craft 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
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 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
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.
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 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.
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:
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).
References
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.
1---2name: audit3description: Audits a website from three perspectives—design, SEO/technical, and LLM/AI-search visibility—and produces a scored, evidence-bound report with prioritized improvements.4license: Apache-2.05---67# stardust:audit89One URL in. One scored, evidence-bound audit out.1011`audit` looks at an existing website from three perspectives — design12(brand tensions + concrete improvement opportunities), SEO/technical,13and LLM/AI-search visibility — measures Core Web Vitals, and14synthesizes everything into a seven-dimension scorecard plus a15prioritized findings ledger that tells the owner what to improve to16generate a better business outcome. The report is also the natural17seed for a redesign: its findings feed `stardust:uplift`'s18improvements list and `stardust:direct`'s Phase 2.5, and it closes19with uplift-shaped redesign directions so "run `stardust:uplift`" is20the obvious next step.2122## Opinionated defaults2324- **Multi-page by default** — `stardust:extract <url> --cap 8`25 (home + seven IA pillars) unless `--single` or `--pages` overrides.26- **Non-interactive** — the audit never asks questions. Every27 assumption it makes instead is recorded in28 `audit.json#assumptions` and stated in the report's executive29 summary.30- **Evidence-bound** — every claim cites a measurement, a `T-*`31 tension id, a check result, or a screenshot observation. A claim32 with no citation does not ship.33- **No fabricated data** — a measurement that could not be taken is34 reported as `not measured (<reason>)`, never estimated silently.35 An estimate, where reasoned, is labeled as one with its basis.36- **Graceful degradation, not failure** — optional capabilities37 (refero, marketing-skills, modern-web-guidance, PageSpeed38 Insights) are probed once and their absence is recorded, never39 fatal. See § Degradation ladder.4041## Inputs4243- `<url>` — required. The site to audit. A path narrows the crawl to44 that subtree (extract's semantics).45- `--pages <n>` — optional. Override the default 8-page extraction46 cap (passed through as `--cap <n>`).47- `--single` — optional. One-page audit of the given URL only. The48 cross-page checks (duplicate titles, sitemap coverage, CTA49 fragmentation across pages) then run on a single page and say so.50- `--deploy` — optional. After the report renders, publish51 `report.html` as a single self-contained page via the DA transport52 (`../deploy/da-deploy-protocol.md`: source PUT → preview → live)53 and print the delivered URL. Transport only — the report never54 goes through deploy's section→block conversion, which would55 decompose the self-contained file.56- `--benchmark` — optional. Force Phase 5 reference benchmarking:57 probe the refero MCP even when the earlier capability probe was58 slow or ambiguous. Without this flag Phase 5 fires only when the59 probe succeeds quickly.6061There are no other flags. Everything else is derived from the62captured surface or governed by the underlying skills' contracts.6364## Phase 0 — Setup65661. Run the master skill's setup (`../stardust/SKILL.md` § Setup) —67 with one audit-specific carve-out: **impeccable absence is a68 degradation here, not the master setup's hard stop.** When the69 dep check fails, record `impeccable: unavailable` in70 `audit.json#degradations` and continue — Phase 2 runs without the71 critique/audit arms (VISION pass + accessibility fold-in still72 fire) and Phase 6 skips the report render; the run ends at stop73 condition (b) *after* `audit.json` is written.742. **Extraction freshness check.** If `stardust/current/` holds an75 extraction of the **same origin** less than **7 days** old —76 origin from `stardust/state.json` (the site record extract77 stamped), recency from the newest78 `pages/<slug>.json#_provenance.fetchedAt` — reuse it79 and record `site.extraction.reused: true`. Otherwise invoke80 `stardust:extract <url> --cap 8` (or `--single` / `--pages <n>`81 per the inputs). Extract owns the crawl, the screenshots,82 `_brand-extraction.json`, `pages/<slug>.json`, `PRODUCT.md` /83 `DESIGN.md`, and `brand-review.html` with its Tensions section.843. **Probe optional capabilities once**, recording each outcome in85 the degradation record (`audit.json#degradations`):86 - `marketing-skills` plugin (`seo-audit`, `ai-seo` skills present?)87 - `modern-web-guidance` (`npx -y modern-web-guidance@latest search88 "<query>"` responds?)89 - refero MCP (attempt `mcp__refero__refero_search_styles`; treat a90 tool-not-found or timeout as unavailable)91 - PageSpeed Insights API (network-reachable without a key?)92 - rollout project (`stardust/rollout/rollout.json` present?)9394If extract fails entirely (site unreachable, bot-management block95past the headed-Chrome fallback), stop and surface extract's error96verbatim — there is nothing to audit. This is the only hard stop97before synthesis; see § Stop conditions.9899## Procedure100101### Phase 1 — Brand surface & tension analysis102103Read `stardust/current/_brand-extraction.json` and104`stardust/current/brand-review.html` § Tensions surfaced (rule105catalog in `../extract/reference/brand-review-template.md`106§ Tensions). Every fired `T-*` tension is candidate evidence for a107finding — carry the ids forward, do not re-derive the detections.108109Compute the four brand-expression measurements the report needs.110Each lands in `audit.json#measurements` with `status` + `method` per111`reference/report-format.md`:112113- **`brandColorShare`** — brand-color share of painted pixels on the114 captured home screenshot. Preferred method: Playwright pixel115 sampling (`method: "pixel-sample"`) — load the screenshot, sample a116 grid (e.g. every 8th pixel), classify each sample to the nearest117 palette entry within a tolerance, and divide brand-hue samples by118 painted (non-white/near-white) samples. When sampling is infeasible119 in the session, a reasoned estimate from the captured surfaces is120 allowed but must ship as `method: "surface-estimate"` with its121 basis — never presented as measured.122- **`ctaFragmentation`** — distinct CTA labels per equivalence bucket,123 aggregated from `pages/*.json#ctas[].label` (the same buckets that124 drive `T-cta-vocab`).125- **`typeScale`** — distinct heading sizes and scale kind/ratio from126 `_brand-extraction.json#type.scaleAudit`.127- **`radiusSprawl`** — distinct border-radius values with occurrence128 counts from `_brand-extraction.json#motifs.borderRadius`.129130### Phase 2 — Design & experience critique131132Three passes over the captured home page (screenshot + live URL),133folded into one set of design findings:1341351. **impeccable critique + audit.** Invoke via the Skill tool using136 the delegation mechanic in `../prototype/SKILL.md` § Invoking137 impeccable (`Skill { skill: "impeccable:impeccable", args:138 "critique <target>" }`, then `"audit <target>"` for the139 accessibility / responsive / performance passes). Normalize its140 findings into the audit's finding shape.1412. **VISION pass.** Study the captured screenshots directly142 (`stardust/current/assets/screenshots/<slug>.png`) and name what a143 design director would: dated patterns the field has moved past,144 hierarchy failures, missed opportunities the captured surface145 doesn't capitalize on. The claim discipline is absolute — every146 observation cites a measurement, a tension id, or a screenshot147 region ("`home.png`, hero: three equal-weight CTAs compete").148 Adjectives without evidence do not become findings.1493. **Accessibility fold-in.** Contrast computed (WCAG ratios for the150 captured palette pairs in the roles they are actually used in),151 alt coverage from `pages/*.json#media.images`, landmark presence152 and heading order from `pages/*.json#landmarks`, content-free link153 labels (reuse `T-link-content-free` when fired).154155### Phase 3 — SEO & technical156157When the `marketing-skills` plugin is installed, follow158`marketing-skills:seo-audit`'s methodology and normalize its159issue/impact/evidence/fix items into findings. When absent, run the160checks directly — they are all curl/Playwright-derivable:161162| area | checks | method |163|---|---|---|164| Crawlability | `robots.txt` present and sane; sitemap declared and valid XML | curl |165| Indexation | canonical present and self-referential; `meta robots` not accidentally `noindex`; http→https single-hop redirect; redirect chains | curl -I |166| Semantics | `main`/`nav`/`footer` landmarks; single `<h1>`; heading hierarchy without skips | pages/*.json + Playwright |167| Metadata | title/description presence + quality per page; duplicates across pages; Open Graph completeness | pages/*.json#metadata |168| Structured data | JSON-LD presence, parse validity, entity types vs page type | Playwright / curl |169170Where a failure matches a `rollout:baseline` check id171(`../rollout/reference/checks.md`: `single-h1`, `title-missing`,172`meta-description`, `canonical`, `sitemap`, `jsonld`, `img-alt`,173`landmark-main`, `duplicate-title`), **reuse that id** as the174finding's `evidence.ref` (`check:<id>`) — findings recorded into a175rollout ledger under a known id get picked up by the AEM autofix176registry automatically.177178**Core Web Vitals.** Measure LCP / CLS / TBT via Playwright179performance APIs (`PerformanceObserver` for180`largest-contentful-paint` and `layout-shift`, `longtask` entries for181TBT) on two viewports: mobile (375×667, CPU throttled where the182session supports it) and desktop (1440×900). When the PageSpeed183Insights API is network-reachable without a key, prefer it and record184`method: "psi-api"` (it adds field INP); otherwise record185`method: "playwright-lab"` and say in the measurement note that lab186TBT is a proxy for INP. Classify every metric against the Google187thresholds tabled in `reference/scoring.md` § performance.188189**Remediation guidance.** When `modern-web-guidance` is installed,190run `npx -y modern-web-guidance@latest search "<specific failure>"`191for each distinct failure class and cite the returned guide ids in192the finding's `guides[]`. When absent, write the generic remediation193and leave `guides: []`.194195### Phase 4 — LLM visibility196197When `marketing-skills:ai-seo` is installed, follow its methodology.198When absent, assess directly:199200- **`llms.txt`** — present at the origin root?201- **Answerability** — does each audited page answer the question a202 user would ask of it ("what does this cost", "what is this") in203 extractable, well-structured prose — and how early on the page?204- **schema.org coverage** — do the JSON-LD entities cover the205 organization plus the page-type entities an answer engine needs206 for entity understanding?207- **Heading-as-question coverage** — what share of `h2`/`h3` map to208 askable questions or scannable topics rather than slogans?209- **Content depth** — extractable prose word counts on key pages;210 specific, citable claims vs thin marketing copy.211- **Key facts in crawlable text** — are pricing, what-it-is, and212 who-it's-for stated in crawlable text, or locked in images and213 JS-rendered widgets?214215Every Phase 4 finding names the concrete fix ("state the three price216points in the pricing table as text; they currently render only217inside the plan-card images"), not a category ("improve content").218219### Phase 5 — Reference benchmarking (optional)220221Fires when the refero MCP tools are reachable — the Phase 0 probe222attempted `mcp__refero__refero_search_styles`; `--benchmark` forces a223re-probe. Skip gracefully when unavailable224(`benchmarks: { status: "skipped", reason: … }`).225226When available: retrieve 2–3 same-vertical reference styles, compare227the audited site's brand expression (Phase 1 measurements) against228what best-in-class in the category does, and cite each reference —229title, URL, one line on what they do better — in the relevant design230findings and in `audit.json#benchmarks.references`.231232### Phase 6 — Synthesis & report2332341. **Scorecard.** Score the seven dimensions per235 `reference/scoring.md` — anchors first, evidence floor enforced,236 not-measured dimensions nulled and renormalized. Compute the237 weighted overall.2382. **Findings.** Consolidate Phases 1–5 into the prioritized ledger:239 P1 (actively losing business or excluding users) / P2 (material240 drag) / P3 (polish). Per finding: `dimension`, `evidence`241 (measurement / tension / screenshot / check / benchmark citation),242 `businessImpact` one-liner, concrete `fix`, `guides[]`.2433. **Uplift directions.** Close with 2–3 redesign directions framed244 exactly like uplift's variant role contract245 (`../uplift/SKILL.md` § The three-variant role contract):246 **A** faithful + fixes (names the findings it resolves), **B** one247 captured-but-underused trait amplified, **C** cinematic (motion as248 identity, register suggested per249 `../prototype/reference/motion-registers.md` § Selection250 heuristic). Drop B when the captured surface can't support a251 differentiated middle — two strong directions beat three weak252 ones.2534. **Write `stardust/audit/<domain-slug>/audit.json`** — schema,254 slug convention, and measurement rules in255 `reference/report-format.md` Part 1. Provenance `_provenance`256 first key.2575. **Render `stardust/audit/<domain-slug>/report.html`** by258 delegating to `$impeccable craft` with the brief in259 `reference/report-format.md` Part 2 — the same Skill-tool260 mechanic as prototype, and the same rule: **never hand-template261 the report**. Run the post-render validation checklist; on262 failure re-invoke craft with the specific violation. Open the263 result with `open stardust/audit/<domain-slug>/report.html`.2646. **Ledger recording (rollout projects only).** When265 `stardust/rollout/rollout.json` exists, record each finding into266 the delivery ledger via267 `node skills/rollout/scripts/findings.mjs record` with source268 namespace `audit:` — `--source audit:<dimension>`, `--layer` from269 the mapping below, severity carried through, `--fixability`270 normalized per `../rollout/reference/audit-sources.md`271 § Recording an external finding. Write each returned id into the272 finding's `ledgerId`.273274 | audit dimension | ledger layer |275 |---|---|276 | `brand-expression` | `brand-tensions` |277 | `visual-hierarchy-craft` | `design-ux` |278 | `conversion-focus` | `content-conversion` |279 | `accessibility` | `accessibility` |280 | `technical-seo` | `seo` (site-wide: `cross-page`) |281 | `content-llm-visibility` | `ai-search` |282 | `performance` | `seo` |2832847. **`--deploy`.** When passed, publish `report.html` via the DA285 transport per `../deploy/da-deploy-protocol.md` — PUT the file as286 a single source, POST preview, POST live, verify the delivered287 URL returns 200 — and print the delivered URL. Transport only;288 never run deploy's section→block conversion on the report.2898. **Chat summary.** Short — the work is on disk and openable:290291 ```292 audit complete — <url>293294 Site health: <overall>/100295 <dimension>: <score> × 7 (not-measured dimensions listed with reasons)296297 Findings: <n> P1 · <n> P2 · <n> P3298 Top lever: <the single highest-impact P1, one line>299300 Report: stardust/audit/<domain-slug>/report.html301 Data: stardust/audit/<domain-slug>/audit.json302303 Next: run stardust:uplift <url> — the report's closing directions304 are its variant briefs.305 ```306307## Degradation ladder308309Probed once in Phase 0; every degradation is recorded in310`audit.json#degradations` and rendered in the report's methodology311appendix. None of these stops the audit.312313| capability absent | behavior |314|---|---|315| refero MCP | skip Phase 5; `benchmarks.status: "skipped"` with reason |316| marketing-skills | run the Phase 3 / Phase 4 checks directly (tabled above) |317| modern-web-guidance | generic remediation text; `guides: []` |318| PageSpeed Insights | Playwright-only lab metrics; measurement note says lab TBT proxies INP |319| Playwright pixel sampling infeasible | `brandColorShare` ships as `method: "surface-estimate"` with basis |320| rollout project | no ledger recording; `ledgerId: null` on every finding |321322## Hard constraints323324- **No fabricated data.** A measurement that could not be taken is325 `not measured (<reason>)` in both artifacts. Estimates are labeled326 with method + basis. This is the same discipline extract enforces327 against synthesis (`../extract/SKILL.md` § Failure modes) —328 fabricated audit numbers are worse than missing ones because they329 are actionable-looking and wrong.330- **Evidence discipline.** Every finding cites observable evidence:331 a measurement key, a `T-*` tension id, a screenshot region, a332 check id, or a benchmark URL. Uncited claims are cut in synthesis.333- **Report is craft-rendered.** `report.html` is authored by334 `$impeccable craft` against the brief in335 `reference/report-format.md`, validated afterward — never336 hand-templated, never hand-patched.337- **Provenance is mandatory** on both artifacts, per338 `../stardust/reference/artifact-map.md` § Provenance shapes.339- **Non-interactive.** No questions in normal flow; assumptions are340 stated in the report. The only stops are the two below.341- **Audit does not fix.** Fixes belong to `uplift` (page redesign),342 `direct` Phase 2.5 (improvements list), and rollout's optimize343 loop (platform autofix). Audit names the fix; it never edits the344 site.345346## Stop conditions347348Stop and surface only if:349350(a) **Extract fails entirely** — site unreachable, structure351 unparseable, bot-management block past the headed-Chrome352 fallback. Surface extract's error verbatim; nothing to audit.353(b) **impeccable unavailable** — Phase 2's critique/audit arms and354 Phase 6's report render require it. Per the Phase 0 carve-out,355 the run continues in degraded mode (VISION pass, SEO/technical,356 LLM visibility, benchmarks all still fire) and writes357 `audit.json`; then stop and tell the user the designed report358 needs the impeccable plugin — deliver the data, not a359 hand-templated substitute.360361Everything else degrades per the ladder; the audit never stops for362confirmation in normal flow.363364## Outputs365366```367stardust/368├── current/ ← from extract (reused when <7 days old)369│ ├── _brand-extraction.json370│ ├── brand-review.html ← Tensions section = Phase 1 input371│ ├── pages/<slug>.json372│ └── assets/screenshots/<slug>.png ← VISION-pass + report evidence figures373└── audit/374 └── <domain-slug>/ ← hostname, www-stripped, dots → dashes375 ├── audit.json ← scorecard, measurements, findings[], provenance376 └── report.html ← craft-rendered, self-contained377378stardust/rollout/optimize/findings.json ← appended via findings.mjs (rollout projects only)379```380381Audit writes no `state.json` entries — extraction state belongs to382`extract`; audit's own artifacts are self-describing via provenance.383Re-running audit against a fresh extraction overwrites384`stardust/audit/<domain-slug>/`; ledger recordings dedupe by the385ledger's own id hash.386387## Scope388389- Audits and prescribes; never modifies the site or its redesign390 artifacts.391- One origin per run. Auditing a competitor set is N runs.392- The natural continuations: `stardust:uplift <url>` (the closing393 directions are its variant briefs), `stardust:direct` (findings394 feed the Phase 2.5 improvements list), rollout's optimize loop395 (ledger findings with known check ids autofix on AEM).396397## References398399- `reference/scoring.md` — the seven dimensions, weights, observable400 anchors at 40/70/90, scoring procedure.401- `reference/report-format.md` — `audit.json` schema (Part 1) and402 the `report.html` craft brief + post-render validation (Part 2).403- `../extract/SKILL.md` — crawl, capture, brand-surface extraction;404 § Failure modes for the anti-synthesis discipline.405- `../extract/reference/brand-review-template.md` § Tensions — the406 `T-*` detector catalog Phase 1 carries forward.407- `../prototype/SKILL.md` § Invoking impeccable — the Skill-tool408 delegation mechanic reused for critique (Phase 2) and the report409 render (Phase 6).410- `../rollout/reference/audit-sources.md` — the findings-ledger411 normalization rules (severity, fixability) Phase 6 applies.412- `../rollout/reference/checks.md` — baseline check ids to reuse so413 AEM autofix picks the findings up.414- `../rollout/scripts/findings.mjs` — the ledger writer (`record`).415- `../uplift/SKILL.md` § The three-variant role contract — the frame416 for the closing uplift directions.417- `../prototype/reference/motion-registers.md` § Selection heuristic418 — register suggestion for direction C.419- `../direct/SKILL.md` § Phase 2.5 — the improvements list audit420 findings feed on a subsequent redesign.421- `../deploy/da-deploy-protocol.md` — the DA transport behind422 `--deploy` (source PUT → preview → live; no block conversion).423- `../stardust/SKILL.md` § Setup — master-skill setup run in Phase 0.424- `../stardust/reference/artifact-map.md` — provenance shapes.