CtrlK
BlogDocsLog inGet started
Tessl Logo

adobe/stardust

Redesign an existing website to make it better. Built on top of impeccable.

71

Quality

89%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

delivery-lint.mdskills/rollout/reference/

Delivery-contract lint (static pre-deploy gate)

The delivery gates have two halves. Static — can this authored HTML even satisfy the EDS/DA contract — runs before PUT, offline, deterministically: scripts/delivery-lint.mjs. Dynamic — does the delivered page actually render — runs after preview/live: scripts/verify.mjs (§ Typed render-truth).

This file documents the static half. It exists because the contract rules below are deterministic truths the pipeline otherwise re-learns by shipping a broken page and reading it back — the migration prompt is essentially a long list of them. Encoding them as a linter moves the knowledge from "the agent remembers" to "the tool enforces".

Run it

node skills/rollout/scripts/delivery-lint.mjs --file <content.html> \
  --path </da/target/path> [--type page|fragment|index] [--json]

--type is inferred from the path when omitted (/nav, /footer, */fragments/* → fragment; */query-index, *.json → index; else page). Exit 1 on any P0 or P1 — wire it as a blocking gate in Phase C before the PUT. P2 is advisory (surfaced, never blocks).

What it checks

RuleSevWhy it breaks delivery
wrapperP0No <body>…<main>…</main></body> → DA silently discards the content. <header>/<footer> absent → P1.
h1P0/P1A page needs exactly one <h1> (SEO + decoration). 0 → P0; >1 → P1. A fragment must have none.
one-cta-per-pP1decorateButtons only buttonizes a link that is the sole content of its <p>. Two emphasized links in one paragraph ship as unstyled text — invisible on light grounds, glaring on a photo hero. Split each CTA into its own <p>.
about-errorP0about:error in the source means a broken image rendition already shipped.
img-pathP0A /img/... src 404s at delivery.
cross-origin-optimizeP2An external <img> inside a block that runs createOptimizedPicture (cards/columns/hero) may be corrupted (dropped ?v=, added &format=webply). Advisory — the authoritative resolve is media-reconcile.mjs.
trailing-slash / html-extensionP1Internal links with a trailing slash or .html 404 on EDS (it serves extensionless, no-trailing-slash).
path-safetyP0The target DA path must be lowercase, hyphenated, no _, no //. A double slash makes the PUT 400 while preview/live still 200 — a silent partial. Normalize and record the original → safe mapping in redirects.tsv.
metadataP2No metadata block → thin query-index rows (no description/og:image at import time).

--optimizing-blocks a,b,c overrides the block list for the cross-origin check (default cards,columns,hero) when a project's block set differs.

Where it sits in Phase C

author content.html
  → delivery-lint  (static; P0/P1 blocks)         ← THIS FILE
  → media-reconcile (resolve every image; C)       ← reference/media-reconciliation.md
  → PUT → preview → live
  → verify.mjs (typed render-truth; D below)       ← reference/delivery-gates.md
  → flip to deployed/verified

The static lint catches the cheap, deterministic failures before spending a network round-trip; the dynamic verify catches what only the renderer knows.

skills

README.md

tile.json