rollout
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesestardust:rollout — whole site → AEM (Edge Delivery Services)
stardust:rollout —— 全站点部署至AEM(Edge Delivery Services)
deployrolloutmigratedeployrolloutextract → direct → prototype → migratedeployrolloutnotes/rollout/PLAN.mddeployrolloutmigratedeployrolloutextract → direct → prototype → migratedeployrolloutnotes/rollout/PLAN.mdWhen to use
使用场景
Full mode — the user has a fully migrated site at
(per-page HTML + from ), an EDS/AEM project + DA
destination (the same target needs), and wants the entire site
delivered, incrementally and resumably.
stardust/migrated/_meta.jsonstardust migratedeployArchetypes-only mode — the user has one migrated archetype per template plus a
full page inventory in (with per page), and wants to
ship all block code immediately without waiting for every page to be migrated.
Sibling pages register as and get their content later via a
separate track.
stardust/state.jsontypecontent-pendingIf there is no tree at all, recommend on at
least the archetype pages first. For a single page, use directly.
stardust/migrated/stardust migratestardust deploy完整模式——用户已在目录下拥有完整的迁移站点(由生成的逐页HTML文件 + ),同时拥有EDS/AEM项目及DA目标地址(与所需的目标地址一致),希望完整交付整个站点,支持增量式交付和断点续传。
stardust/migrated/stardust migrate_meta.jsondeploy仅原型模式——用户针对每个模板拥有一个已迁移的原型页面,且中包含完整的页面清单(每个页面都标注了),希望立即部署所有区块代码,无需等待每个页面完成迁移。同模板的其他页面会被标记为,后续通过单独的内容交付流程补充内容。
stardust/state.jsontypecontent-pending如果完全没有目录,建议先对至少原型页面执行。若仅需部署单个页面,请直接使用。
stardust/migrated/stardust migratestardust deploySetup
前置准备
- Run the master skill's setup (§ Setup).
skills/stardust/SKILL.md - Verify exists with at least one
stardust/migrated/page (full mode: all pages; archetypes-only: the archetypes + a*.htmlwithstate.jsonpopulated). If not, recommendtypeon the archetypes and stop.stardust migrate - Verify the EDS/AEM target is ready exactly as requires (project scaffolding,
deploy, code branch pushable).DA_TOKENadds no new transport.rollout - If is true (
state.json.handsOff§ Hands-off mode), run full-auto: no per-phase pauses. Every gate and verify step below runs unchanged — hands-off removes waiting, not validation.skills/stardust/SKILL.md
- 运行主技能的设置流程(详见§ 安装设置)。
skills/stardust/SKILL.md - 确认目录存在,且至少包含一个
stardust/migrated/页面(完整模式:包含所有页面;仅原型模式:包含原型页面 + 已填充*.html字段的type)。若不存在,建议先对原型页面执行state.json,然后停止当前流程。stardust migrate - 确认EDS/AEM目标地址已准备就绪,完全符合的要求(项目框架搭建完成、
deploy配置妥当、代码分支可推送)。DA_TOKEN不会新增任何传输方式。rollout - 如果为
state.json.handsOff(详见true§ 全自动模式),则运行全自动流程:无阶段间暂停。以下所有检查和验证步骤均保持不变——全自动模式仅移除等待环节,不会跳过验证。skills/stardust/SKILL.md
Procedure
操作流程
Phase A — Inventory (build the coverage)
阶段A —— 盘点(构建覆盖范围)
bash
node skills/rollout/scripts/inventory.mjs --site-url <source-url>bash
node skills/rollout/scripts/inventory.mjs --site-url <source-url>defaults: --migrated stardust/migrated --out stardust/rollout
默认参数: --migrated stardust/migrated --out stardust/rollout
archetypes-only mode: add the full page roster from state.json
仅原型模式:从state.json加载完整页面清单
node skills/rollout/scripts/inventory.mjs --site-url <source-url> --state stardust/state.json
Writes `coverage/pages.json` (one row per page: slug, delivered `path`,
`templateId`, `blocks`, `sourceHash`, `delivery` status), `coverage/templates.json`
(pages grouped by template), and `rollout.json` (target + DA config + `lastRun`).
**Archetypes-only mode** (`--state`): pages with a `_meta.json` are seeded as in
full mode; pages present only in `state.json` are seeded with `templateId` from
`type`, `blocks` from the archetype sidecar, and `delivery.status:
content-pending`.
Inventory is **idempotent and incremental**: delivery status is preserved; a page
whose migrated HTML changed after delivery is re-flagged `stale`. Fill in the DA
coordinates in `rollout.json` (`site.da.org`, `site.site`, `site.da.ref`,
`site.liveHost`) if not inferred.node skills/rollout/scripts/inventory.mjs --site-url <source-url> --state stardust/state.json
生成`coverage/pages.json`(每页一条记录:slug、交付路径`path`、`templateId`、`blocks`、`sourceHash`、`delivery`状态)、`coverage/templates.json`(按模板分组的页面信息)和`rollout.json`(目标地址 + DA配置 + `lastRun`记录)。
**仅原型模式**(使用`--state`参数):带有`_meta.json`的页面会按完整模式初始化;仅在`state.json`中存在的页面会通过`type`字段获取`templateId`,通过原型侧栏文件获取`blocks`,并标记`delivery.status: content-pending`。
盘点操作具备**幂等性和增量性**:交付状态会被保留;若交付后已迁移的HTML文件发生变更,页面会被重新标记为`stale`(过期)。如果未自动推断出DA坐标,请在`rollout.json`中填写相关信息(`site.da.org`、`site.site`、`site.da.ref`、`site.liveHost`)。Phase B — Block dedup plan (FIRST-CLASS, before any conversion)
阶段B —— 区块去重规划(核心步骤,在任何转换之前执行)
bash
node skills/rollout/scripts/blocks.mjs # → coverage/blocks.json (the dedup unit)
node skills/rollout/scripts/plan.mjs # → plan.json + a readable conversion plan- collapses every block instance (per-page
blocks.mjs+ chrome) into the distinct set, assigns each a canonicalmodules(kebab, reserved-class-guarded per deploy #15), and recordsedsBlockName/usedByPages. Chrome (instanceCount/header/nav) isfooter→ site-wide authored documents (kind: chrome,/nav) fed to the header/footer blocks. In archetypes-only mode the archetype sidecars fully determine the block set;/footerpages add none.content-pending - orders pages representative-first per template and gives each distinct block a single conversion point: the first page that uses it CONVERTS it, every later page REUSES it by name. The per-page
plan.mjs/convertlists are exactlyreuse's Step-7 brief input, so each block converts once without changing deploy.deploypages are alwayscontent-pending.convert: []
Extending an already-delivered site? A "new template" is almost always a new COMPOSITION of the existing block library, not new block code — auditfirst. Seeblocks/.reference/operational-learnings.md
bash
node skills/rollout/scripts/blocks.mjs # → coverage/blocks.json(去重后的区块单元)
node skills/rollout/scripts/plan.mjs # → plan.json + 可读的转换规划文档- 会将每个区块实例(每页的
blocks.mjs+ 通用组件)合并为唯一集合,为每个区块分配标准的modules(短横线命名格式,遵循deploy #15的保留类规则),并记录edsBlockName/usedByPages。通用组件(instanceCount/header/nav)标记为footer,对应站点级的可编辑文档(kind: chrome、/nav),供页眉/页脚区块调用。在仅原型模式下,区块集合完全由原型侧栏文件决定;/footer页面不会新增任何区块。content-pending - 会按模板优先排序规划页面顺序,为每个唯一区块分配唯一转换节点:第一个使用该区块的页面负责转换它,后续所有页面均通过
plan.mjs复用该区块(无需重新创建)。每页的edsBlockName/convert列表完全匹配reuse步骤7的输入要求,因此每个区块仅需转换一次,且无需修改deploy流程。deploy页面的content-pending列表始终为空。convert
扩展已交付的站点?“新模板”几乎总是现有区块库的新组合,而非新的区块代码——请先审核目录。详见blocks/。reference/operational-learnings.md
Phase B2 — Metadata contract for dynamic listings (PRE-IMPORT GATE)
阶段B2 —— 动态列表的元数据约定(导入前检查)
Do this before Phase C — the import is blocked on it. What a dynamic listing
block can show is bounded by what each page emits, and retrofitting metadata across
thousands of already-published pages is a second migration. Before importing,
produce (which blocks are dynamic vs static, the index each
reads, the fields its cards need) and a metadata contract (the
each content TYPE must carry). Then have Phase C's brief emit the contract
per page, and author from the same contract. When
Phase 4.5 already ran,
and exist — verify them against the inventory here instead of
redoing them.
dynamic-blocks-map.md<meta name="…">deployhelix-query.yamlstardust:prepare-migrationstardust/dynamic-blocks-map.mdhelix-query.yamlMechanics (key→meta-name rules, what a row can carry): .
reference/dynamic-listings.md必须在阶段C之前完成此步骤——导入操作会被此步骤阻塞。动态列表区块能展示的内容受限于每个页面输出的元数据,而在数千个已发布页面中补全元数据相当于二次迁移。导入之前,需生成(标记哪些区块是动态/静态、每个区块读取的索引、卡片所需的字段)以及元数据约定(每种内容类型必须包含的标签)。随后在阶段C的流程中,按约定为每个页面生成元数据,并根据同一约定编写。如果阶段4.5已执行,和已存在——此时只需在此阶段根据盘点结果验证其正确性,无需重新生成。
dynamic-blocks-map.md<meta name="…">deployhelix-query.yamlstardust:prepare-migrationstardust/dynamic-blocks-map.mdhelix-query.yaml实现机制(键→元数据名称规则、每条记录可包含的内容):详见。
reference/dynamic-listings.mdPhase C — Deliver the site (drive deploy
per page, per the plan)
deploy阶段C —— 交付站点(按规划逐页调用deploy
)
deployBlocked on Phase B2 — author each page's metadata contract into its metadata
block during delivery, so the indexes are rich at import time.
Walk in order (representative pages first). For each page:
plan.json.steps-
Convert + push the migrated HTML () to AEM via the
source.migratedHtmlmethodology. Pass the plan step into deploy's brief: create only the blocks indeploy; for each block inconvert, REUSE the existing block by itsreuse(do not recreate).edsBlockNamepages (archetypes-only): no migrated HTML — skip the document push entirely (no shell/placeholder), recordcontent-pending, surface as "awaiting content track." Their block code is already deployed via the archetype.content-pending -
Static contract lint (pre-PUT, deterministic). Before the push, run the delivery-contract linter — it catches the cheap, deterministic failures (wrapper, one-CTA-per-, trailing-slash, path-safety,
<p>src,/img/) offline so a broken page never reaches preview. Mechanics inabout:error. A P0/P1 blocks the PUT.reference/delivery-lint.mdbashnode skills/rollout/scripts/delivery-lint.mjs --file <html> --path </da/path> node skills/rollout/scripts/media-reconcile.mjs --file <html> --deploy-host <branch>--<repo>--<owner>.aem.live [--apply]resolves every image on the network and decides optimize/keep/rewrite/omit (media-reconcile) — the authoritative form of the image-fidelity gate below.skills/migrate/reference/media-reconciliation.md -
Run the delivery gates before flipping a page to. Each is a one-line rule here; mechanics + helpers in
deployed:reference/delivery-gates.md- Source-fidelity — don't add sections the source lacks; never fabricate
facts.
node skills/rollout/scripts/section-fidelity.mjs --file <html> --source <url> - Image-fidelity — every authored src must return 200 or be omitted; never ship
<img>. Run<img src="about:error">(step 2).media-reconcile.mjs - Path-safety — normalize source paths to AEM-Edge-safe form (lowercase, no
trailing /
-, no_segment); record original→normalized in--. (delivery-lint flags violations.)stardust/redirects.tsv - Source-content hygiene — skip dead source URLs; author bodyless/PDF-only
sources thin and faithful (tier ,
thin), don't pad with invented prose.skills/migrate/reference/fidelity-tiers.md - Fidelity tier declared — record each page's (archetype/sibling/thin) so coverage shows what was craft-gated vs cloned (
fidelityTier).skills/migrate/reference/fidelity-tiers.md
- Source-fidelity — don't add sections the source lacks; never fabricate
facts.
-
Record outcomes with the state-writer (never hand-edit the ledger):bash
node skills/rollout/scripts/update-coverage.mjs <slug> --status converting node skills/rollout/scripts/update-coverage.mjs --block <id> --status converted --eds-name <name> node skills/rollout/scripts/update-coverage.mjs <slug> --status deployed --url <branch-preview-url> node skills/rollout/scripts/update-coverage.mjs <slug> --status content-pending # no document pushPublish in the loop (), don't stop at preview — any query-index (Phase D2) builds from the live tree, so a preview-only delivery leaves indexes empty. On failure:PUT → preview → liveand continue (one page's failure never aborts the rollout).--status failed --error "<reason>"
Foundation-first gate (hard block, once per rollout). When the FIRST
archetype page flips to , stop and prove the foundation before
authoring any second page: run (both probes) against its
prototype, plus computed-style invariants in a headless render — grid
containers compute (not stacked single-column), sections are
full-bleed where the design says so, and the CTA/button classes are actually
styled (per ,
§ Runtime-detection probe). A wrong runtime assumption (block wrapper class,
button classes) is silent and sitewide — typography still looks fine while
every grid stacks. This one gate is the difference between fixing one page
and rebuilding every template.
deployedstardust:diffdisplay: gridstardust/runtime-contract.jsonskills/deploy/SKILL.mdExecution model: waves. Deliver in waves of parallel author-only agents
— each agent curls its source pages and writes files only, never deploys or
edits blocks — template clusters concurrently (non-overlapping pages),
representative-first so blocks exist to be reused; then a central deploy
per page; then background batches with a per-page OK/FAIL ledger, re-driving
FAILs only. For clusters of 6–20+ siblings, the full flow is
§ Batched delivery. The central deploy step
should run the bundled, resumable driver rather than a serial loop:
(concurrency pool, persistent ledger that skips
already-live pages, retry/backoff, append-only log, delivered- check).
After a transient blip, re-run the same command — it re-drives only the FAILs.
Then reconcile the ledger into coverage with .
reference/delivery-gates.mdnode skills/deploy/scripts/deploy-batch.mjs --org <org> --repo <repo> --branch <branch> --content <dir>.plain.htmlupdate-coverage.mjs此阶段被阶段B2阻塞——交付过程中需将元数据约定写入每个页面的元数据区块,确保导入时索引内容完整。
按中的顺序执行(优先处理代表页面)。针对每个页面:
plan.json.steps-
转换并推送已迁移的HTML文件()至AEM,遵循
source.migratedHtml的流程规范。将规划步骤传入deploy的简短指令:仅创建deploy列表中的区块;对于convert列表中的每个区块,通过reuse复用现有区块(无需重新创建)。edsBlockName页面(仅原型模式):无已迁移的HTML文件——完全跳过文档推送(无需创建占位符/外壳),标记为content-pending,显示为“等待内容交付”。其区块代码已通过原型页面部署完成。content-pending -
静态约定检查(推送前执行,确定性检查)。推送之前,运行交付约定检查工具——它会离线检测简单的确定性错误(包装器、每个标签仅包含一个CTA、尾斜杠、路径安全性、
<p>资源地址、/img/),避免错误页面进入预览环境。实现机制详见about:error。P0/P1级错误会阻止推送。reference/delivery-lint.mdbashnode skills/rollout/scripts/delivery-lint.mjs --file <html> --path </da/path> node skills/rollout/scripts/media-reconcile.mjs --file <html> --deploy-host <branch>--<repo>--<owner>.aem.live [--apply]会解析网络上的每张图片,决定优化/保留/重写/忽略(详见media-reconcile)——这是图片保真度检查的权威标准。skills/migrate/reference/media-reconciliation.md -
执行交付检查,然后将页面标记为。以下是每条检查的简要规则,详细机制和辅助工具详见
deployed:reference/delivery-gates.md- 源内容保真——不得添加源页面没有的内容;不得虚构信息。执行命令:
node skills/rollout/scripts/section-fidelity.mjs --file <html> --source <url> - 图片保真——每个可编辑的资源地址必须返回200状态码,否则需忽略;不得发布
<img>。执行步骤2中的<img src="about:error">。media-reconcile.mjs - 路径安全性——将源路径标准化为符合AEM-Edge安全规范的格式(小写、无尾部/
-、无_分段);在--中记录原始路径→标准化路径的映射。(交付检查工具会标记违规情况。)stardust/redirects.tsv - 源内容清理——跳过无效的源URL;对于无正文/仅含PDF的源页面,生成简洁且保真的内容(层级,详见
thin),不得添加虚构内容。skills/migrate/reference/fidelity-tiers.md - 保真层级标记——记录每个页面的(原型/同模板/简洁),以便覆盖范围统计显示哪些页面经过人工检查、哪些是批量克隆的(详见
fidelityTier)。skills/migrate/reference/fidelity-tiers.md
- 源内容保真——不得添加源页面没有的内容;不得虚构信息。执行命令:
-
记录结果(必须使用状态写入工具,不得手动编辑台账):bash
node skills/rollout/scripts/update-coverage.mjs <slug> --status converting node skills/rollout/scripts/update-coverage.mjs --block <id> --status converted --eds-name <name> node skills/rollout/scripts/update-coverage.mjs <slug> --status deployed --url <branch-preview-url> node skills/rollout/scripts/update-coverage.mjs <slug> --status content-pending # 未推送文档在流程中完成发布(),不要停留在预览阶段——任何查询索引(阶段D2)都基于**已发布(live)**的内容树,因此仅完成预览的交付会导致索引为空。若失败:执行PUT → preview → live并继续流程(单个页面失败不会终止整个部署)。--status failed --error "<reason>"
基础验证检查(硬阻塞,整个部署流程仅执行一次)。当第一个原型页面被标记为时,暂停流程并先验证基础内容:针对其原型页面运行(两种探测方式),加上无头渲染中的计算样式不变性检查——网格容器需计算为(而非堆叠的单列布局),设计要求全屏的区域需全屏显示,CTA/按钮类需正确应用样式(遵循、 § 运行时探测规则)。错误的运行时假设(区块包装器类、按钮类)不会产生警告,但会影响整个站点——排版看起来正常,但所有网格都会堆叠。此检查是修复单个页面还是重建所有模板的关键区别。
deployedstardust:diffdisplay: gridstardust/runtime-contract.jsonskills/deploy/SKILL.md执行模式:分批交付。以并行的仅编辑代理分批交付——每个代理仅获取源页面并写入文件,不执行部署或编辑区块操作;按模板集群并行处理(页面不重叠),优先处理代表页面以便区块可被复用;随后针对每个页面执行集中部署;最后后台批量处理失败页面,仅重新执行失败任务。对于包含6–20+个同模板页面的集群,完整流程详见 § 批量交付流程。集中部署步骤应使用捆绑的可续传驱动程序,而非串行循环:(包含并发池、跳过已发布页面的持久化台账、重试/退避机制、追加日志、已交付检查)。遇到临时故障后,重新运行同一命令——它会仅重新执行失败任务。随后使用将台账同步至覆盖范围统计。
reference/delivery-gates.mdnode skills/deploy/scripts/deploy-batch.mjs --org <org> --repo <repo> --branch <branch> --content <dir>.plain.htmlupdate-coverage.mjsPhase D — Site assembly (whole-site artifacts)
阶段D —— 站点组装(全站点 artifacts)
bash
node skills/rollout/scripts/assemble.mjs # → rollout/site/{sitemap.xml,robots.txt,manifest.json}Generates site-wide artifacts: + from delivered paths,
and a fragments manifest mapping chrome blocks to the authored chrome documents
(, ) with their source
( authors + deploys the documents through the normal content chain —
they MUST be published or the chrome 404s sitewide).
Redirects: if Phase C's path-safety gate emitted , wire
it into the EDS redirects mechanism here so original inbound URLs don't 404.
sitemap.xmlrobots.txtcontent/nav.htmlcontent/footer.htmlcanon/*.htmldeploystardust/redirects.tsvbash
node skills/rollout/scripts/assemble.mjs # → rollout/site/{sitemap.xml,robots.txt,manifest.json}生成站点级 artifacts:从已交付路径生成 + ,以及将通用组件映射至可编辑通用文档(、)的片段清单,同时包含它们的源文件(通过常规内容链编辑并部署这些文档——必须发布这些文档,否则全站通用组件会返回404)。
重定向配置:如果阶段C的路径安全性检查生成了,在此阶段将其接入EDS重定向机制,避免原始入站URL返回404。
sitemap.xmlrobots.txtcontent/nav.htmlcontent/footer.htmlcanon/*.htmldeploystardust/redirects.tsvPhase D2 — Dynamic listings (query-index) — optional
阶段D2 —— 动态列表(查询索引)——可选
Blocks that LIST other pages (directories, news/event feeds, "related" rails)
should read an EDS query-index rather than static cards. Build it from the B2
contract: author (scoped indexes), rewrite the listing blocks to
their index (with filter/sort/paginate + an authored fallback), and
validate one flagship end-to-end. The index builds from the published (live)
tree — publish before expecting rows. Full mechanics: .
helix-query.yamlfetchreference/dynamic-listings.mdIndex resilience. After a bulk publish, poll the index with a
timeout (indexing is async; a freshly-synced config sits at /404
first) — don't assert once and fail. Decode per row as not-published, not a bad selector: publish the page and
re-poll ( § The publish gotcha). If the index
never settles inside the timeout, the documented degraded mode is a
committed static index JSON (generated from the coverage ledger, served from
the code branch) + regeneration on content change — the listing blocks read
the same row shape either way, so the swap back is a URL change.
totalbuilding"requested path returned a 301 or 404"reference/dynamic-listings.md用于列出其他页面的区块(目录、新闻/活动提要、“相关内容”侧边栏)应读取EDS的查询索引,而非静态卡片。根据B2阶段的约定构建索引:编写(范围索引),重写列表区块以索引(包含过滤/排序/分页 + 可编辑的回退内容),并验证一个旗舰页面的端到端流程。索引基于**已发布(live)**的内容树构建——发布后才能获取记录。完整机制详见。
helix-query.yamlfetchreference/dynamic-listings.md索引容错性。批量发布后,轮询索引的字段并设置超时(索引构建是异步的;新同步的配置最初会处于/404状态)——不要仅检查一次就判定失败。将每条记录中的解读为未发布,而非选择器错误:发布页面后重新轮询(详见 § 发布陷阱)。如果索引在超时时间内仍未就绪,文档中规定的降级模式是使用已提交的静态索引JSON(从覆盖范围台账生成,从代码分支提供服务) + 内容变更时重新生成——列表区块读取的记录格式一致,因此切换仅需修改URL。
totalbuilding"requested path returned a 301 or 404"reference/dynamic-listings.mdPhase D3 — Multilingual (per-language trees) — optional
阶段D3 —— 多语言支持(按语言划分内容树)——可选
When the source has language trees (, ), add them as parallel content
trees that REUSE the same block library — only authored content and a little wiring
change (language-routed chrome documents, per-language indexes, per-language path-safety).
See .
/fr/…/en/…reference/multilingual.md如果源站点包含语言目录(、),将它们作为并行内容树添加,复用同一区块库——仅需修改可编辑内容和少量配置(按语言路由的通用文档、按语言划分的索引、按语言进行路径安全性检查)。详见。
/fr/…/en/…reference/multilingual.mdPhase E — Full-site verify
阶段E —— 全站点验证
bash
node skills/rollout/scripts/verify.mjs # uses rollout.json site.liveHostbash
node skills/rollout/scripts/verify.mjs # 使用rollout.json中的site.liveHostor: --base <url> (explicit host) | --root <dir> (offline, against a local export)
或:--base <url> (指定主机) | --root <dir> (离线模式,针对本地导出内容)
For every delivered page, `verify` confirms HTTP 200, no `about:error` (deploy
#75), and that every internal `href="/…"` resolves to a known delivered path — then
flips each page to `verified` or `failed`. Exits non-zero if any page failed.
**Headless render check (per template).** A 200 `.plain.html` can still render
blank — decoration failures (missing script, wrong block wrapper class, 404
chrome) are invisible to a text check. On the FIRST delivered page of each
template (home included), load the live URL in a headless browser and assert
decoration ran: the runtime's `body.appear` class is set (per
`stardust/runtime-contract.json`), `main .section` count > 0,
zero `pageerror` events, zero broken images.
针对每个已交付页面,`verify`会确认HTTP状态码为200、无`about:error`(deploy #75)、每个内部`href="/…"`均指向已交付的已知路径——然后将每个页面标记为`verified`或`failed`。如果有页面失败,命令会返回非零状态码。
**无头渲染检查(按模板执行)**。返回200状态码的`.plain.html`页面仍可能渲染空白——装饰失败(缺少脚本、错误的区块包装器类、通用组件404)无法通过文本检查发现。针对每个模板的第一个已交付页面(包括首页),在无头浏览器中加载在线URL并确认装饰已执行:运行时已设置`body.appear`类(遵循`stardust/runtime-contract.json`)、`main .section`数量>0、无`pageerror`事件、无损坏图片。Phase E2 — Link-audit completeness
阶段E2 —— 链接审计完整性
verify.mjsreference/operational-learnings.md- Nav/footer/landing targets are NOT archetype siblings. Enumerate every
in the
href+/navdocuments plus each section's index/landing page and confirm each is deployed + published + verified — and that the chrome documents THEMSELVES are published — otherwise they get committed but never published, their links 404, and the dashboard still reads 100%./footer - Localize source-site bounce links whose path has a delivered local 200 page (header/footer/home first); keep an absolute source link only when no local page exists (a bounce beats a 404).
- Strip trailing slashes and from internal links. EDS serves extensionless documents with no trailing slash, so
.htmland/x/y/both 404 (render the 404 block) while/x/y.htmlstill passes — nav reads green, every link is dead. Normalize every internal.plain.html(keep barehref); repoint/links with no local page at the working source URL..html - The audit GETs each href against the LIVE tree. Structural resolution against the ledger misses trailing-slash and case defects that only delivery exposes.
verify.mjsreference/operational-learnings.md- 导航/页脚/落地页目标并非原型同模板页面。枚举+
/nav文档中的所有/footer,以及每个板块的索引/落地页,确认每个目标均已部署 + 发布 + 验证——同时确认通用文档本身已发布,否则这些文档会被提交但从未发布,其链接会返回404,而仪表盘仍显示100%完成。href - 本地化源站点的跳转链接:如果路径对应的本地页面已交付并返回200(优先处理页眉/页脚/首页),则使用本地化链接;仅当本地页面不存在时保留绝对源链接(跳转链接优于404)。
- 移除内部链接的尾斜杠和后缀。EDS提供无后缀、无尾斜杠的文档,因此
.html和/x/y/都会返回404(渲染404区块),而/x/y.html仍会通过检查——导航显示正常,但所有链接均失效。标准化每个内部.plain.html(保留裸路径href);对于无对应本地页面的/链接,重新指向可用的源URL。.html - 审计会针对已发布内容树获取每个href。基于台账的结构解析无法发现仅在交付时才暴露的尾斜杠和大小写问题。
Phase F — Optimize: multi-source audit + gate (delivery quality)
阶段F —— 优化:多源审计 + 检查(交付质量)
The in-flow quality gate. optimize aggregates findings from existing audit
skills into one ledger ( + ),
tags each by fixability, and gates the rollout. Sources (full mapping in
):
optimize/findings.jsonoptimize/scorecard.jsonreference/audit-sources.md- — built-in deterministic detectors:
rollout:baselinebashnode skills/rollout/scripts/optimize.mjs # uses rollout.json site.liveHost # or: --base <url> | --root <dir> | --slug <s> | --all - +
impeccable:critique— design quality + a11y/perf.impeccable:audit - The marketing SEO skills — ,
seo-audit,schema,ai-seo.site-architecture - — mechanical design tensions from
stardust:tensions.stardust/current/brand-review.html
Normalize each source's findings into the ledger with the writer:
bash
node skills/rollout/scripts/findings.mjs record \
--source marketing:seo-audit --layer seo --check thin-content \
--severity P2 --fixability platform-migration \
--scope-ids blog/post --evidence "…" --recommend "…"
node skills/rollout/scripts/findings.mjs resolve <id> --status accepted --note "…"All sources share one id space, dedup, scorecard, and the detect → fix → verify
loop: re-running a source resolves its own gone findings; a regressed
finding re-opens; human / are preserved. Fixability routing:
→ autofix / re-deploy; → upstream (surface
only); → informational. The gate exits non-zero if any open P1 is
in scope — a page is delivery-clean only when verify passes and the ledger has
no open P1.
fixedacceptedwontfixplatform-migrationdesign-passout-of-scopeAt ~1k-page scale: a-level fix needs a site-wide republish to land and flip its per-page findings; the optimize gate only audits pages inhead.html; and faithfully migrated parallel source trees produce legitimate duplicate-title findings (a canonical decision, not a bug). Seecoverage/pages.json.reference/operational-learnings.md
The judgment layers (brand-tensions, design-ux, content-conversion) are scored
until populated by the impeccable/tensions sources — the scorecard shows
not-assessed rather than faking a score.
null流程内的质量检查。optimize会将现有审计技能的结果汇总至一个台账( + ),按可修复性标记每个问题,并阻塞部署流程。数据源(完整映射详见):
optimize/findings.jsonoptimize/scorecard.jsonreference/audit-sources.md- ——内置的确定性检测器:
rollout:baselinebashnode skills/rollout/scripts/optimize.mjs # 使用rollout.json中的site.liveHost # 或:--base <url> | --root <dir> | --slug <s> | --all - +
impeccable:critique——设计质量 + 无障碍/性能审计。impeccable:audit - 营销SEO技能——、
seo-audit、schema、ai-seo。 可选;如果缺失,显示提示信息。site-architecture - ——来自
stardust:tensions的机械设计冲突。stardust/current/brand-review.html
使用写入工具将每个数据源的结果标准化至台账:
bash
node skills/rollout/scripts/findings.mjs record \\
--source marketing:seo-audit --layer seo --check thin-content \\
--severity P2 --fixability platform-migration \\
--scope-ids blog/post --evidence "…" --recommend "…"
node skills/rollout/scripts/findings.mjs resolve <id> --status accepted --note "…"所有数据源共享同一ID空间,支持去重、计分卡和检测→修复→验证循环:重新运行数据源会自动标记已解决的问题;已修复的问题若再次出现会重新打开;人工标记的/状态会被保留。可修复性路由: → 自动修复 / 重新部署; → 上游反馈(仅展示); → 信息提示。如果存在任何未解决的P1级问题,检查会返回非零状态码——只有当验证通过且台账中无未解决的P1级问题时,页面才符合交付质量要求。
acceptedwontfixplatform-migrationdesign-passout-of-scope针对约1000页规模的站点:级别的修复需要全站重新发布才能生效并更新每页的问题记录;optimize检查仅审计head.html中的页面;忠实迁移的并行源站点会产生合法的重复标题问题(这是规范决策,而非bug)。详见coverage/pages.json。reference/operational-learnings.md
判断层(品牌冲突、设计UX、内容转化)的分数默认为,需等待impeccable/tensions数据源填充后才会更新——计分卡会显示“未评估”,而非伪造分数。
nullPhase G — AEM autofix (close the loop)
阶段G —— AEM自动修复(闭环处理)
bash
node skills/rollout/scripts/autofix-aem.mjs --project <eds-root> # [--dry-run] [--slug s] [--check c]The platform autofix engine (AEM-EDS, v1 — aggressive). For every open finding
whose has a registered EDS fixer, it edits the EDS project files, logs
the change on , and stages the finding :
checkfinding.autofixin-progress- deterministic — (exactly one
eds-fix-h1), sitemap (re-assemble).<h1> - content-draft (logged for review) — /
eds-metadata-title,eds-metadata-description,eds-alt-draft.eds-disambiguate-title - manual (prepares guidance/payload) — (use
eds-jsonld),marketing:schema,eds-canonical.eds-landmark-main
Use first. After applying, re-deploy the edited pages, then re-run
verify + optimize — staged findings flip to . findings
are surfaced, not auto-fixed.
--dry-runfixeddesign-passbash
node skills/rollout/scripts/autofix-aem.mjs --project <eds-root> # [--dry-run] [--slug s] [--check c]平台自动修复引擎(AEM-EDS,v1版本——主动修复)。对于每个未解决且字段已注册EDS修复器的问题,它会编辑EDS项目文件,在中记录变更,并将问题标记为:
checkfinding.autofixin-progress- 确定性修复——(确保仅有一个
eds-fix-h1)、站点地图(重新组装)。<h1> - 内容草稿(记录供审核)——/
eds-metadata-title、eds-metadata-description、eds-alt-draft。eds-disambiguate-title - 手动修复(准备指导/负载)——(使用
eds-jsonld)、marketing:schema、eds-canonical。eds-landmark-main
建议先使用参数试运行。应用修复后,重新部署已编辑的页面,然后重新运行verify + optimize——已标记为的问题会切换为。问题仅展示,不自动修复。
--dry-runin-progressfixeddesign-passPhase H — Report
阶段H —— 生成报告
Read + (or re-run ):
rollout.json.lastRunoptimize/scorecard.jsoninventory.mjsrollout — <site> → aem-eds
==================================================
Pages <N> total · <v> verified · <d> deployed · <p> pending · <cp> content-pending · <s> stale
Templates <T> (per-template delivered/total)
Blocks <B> total · <c> converted · <p> pending
Quality health <H>/100 · open P1 <n> / P2 <n> / P3 <n>
To deliver <list of remaining slugs>
Content <cp> pages awaiting content track (block code deployed, document not yet pushed)Surface // as the explicit "what's missing" list.
pages are listed separately — not failures; their block code is
live and they advance to automatically when emits their HTML
and is re-run.
pendingstalefailedcontent-pendingpendingmigrateinventoryAlso write/refresh per
: one entry per failure class this run
surfaced (evidence, proposed skill + section to change, ).
plugin maintainers harvest pending entries into skill
diffs — this is how a run's hard-won fixes stop being re-learned.
stardust/learnings.mdskills/stardust/reference/learnings.mdstatus: pending读取 + (或重新运行):
rollout.json.lastRunoptimize/scorecard.jsoninventory.mjsrollout — <site> → aem-eds
==================================================
页面总数 <N> · 已验证 <v> · 已部署 <d> · 待部署 <p> · 内容待处理 <cp> · 过期 <s>
模板数量 <T>(按模板统计已交付/总数)
区块总数 <B> · 已转换 <c> · 待转换 <p>
质量评分 健康度 <H>/100 · 未解决P1 <n> / P2 <n> / P3 <n>
待交付页面 <剩余slug列表>
内容待处理 <cp>个页面等待内容交付(区块代码已部署,文档尚未推送)将//页面列为明确的“待完成”列表。页面单独列出——不属于失败页面;其区块代码已上线,当生成其HTML文件并重新运行后,会自动从转为。
pendingstalefailedcontent-pendingmigrateinventorycontent-pendingpending同时编写/更新,遵循的规范:针对本次部署中出现的每个故障类别添加一条记录(包含证据、建议修改的技能及章节、)。插件维护者会收集待处理记录并更新技能——这能避免重复踩坑,将本次部署积累的经验固化为流程改进。
stardust/learnings.mdskills/stardust/reference/learnings.mdstatus: pendingPhase I — Dashboard
阶段I —— 生成仪表盘
bash
node skills/rollout/scripts/dashboard.mjs # → dashboard/index.html + data.jsonA self-contained, no-external-JS dashboard rendered in the project's design
identity (brand tokens read from a migrated page's ). Centerpiece: a
page tree of every identified page, nested by URL path, each node colour-coded
by the most-advanced lifecycle stage it reached:
:rootidentified → prototyped → deployed → optimisedThe stage spans ( → identified,
→ prototyped), rollout coverage
(/ → deployed), and optimize ( = verified and no
open findings). A sibling stays at (it's in the
ledger so delivery can be tracked, but has no designed document yet). Legend counts
are cumulative. Template archetypes are badged ; a page with open
findings shows a red count. Also a templates table + the quality scorecard.
is the inspectable snapshot — regenerate at every iteration
boundary. ( is read-only and optional.)
state.jsonrostered/extracted/directedprototyped/approved/migrateddeployedverifiedoptimisedcontent-pendingidentifiedTdashboard/data.jsonstate.jsonbash
node skills/rollout/scripts/dashboard.mjs # → dashboard/index.html + data.json生成一个独立、无外部JS依赖的仪表盘,采用项目的设计风格(从已迁移页面的读取品牌标识)。核心功能:展示所有已识别页面的页面树,按URL路径嵌套,每个节点按其达到的最高生命周期阶段标记颜色:
:root已识别 → 已原型化 → 已部署 → 已优化阶段状态涵盖( → 已识别, → 已原型化)、rollout覆盖范围(/ → 已部署)和optimize( = 已验证 且 无未解决问题)。的同模板页面会停留在阶段(已纳入台账以便跟踪交付,但尚未生成设计文档)。图例计数为累计值。模板原型会标记徽章;存在未解决问题的页面会显示红色计数。同时包含模板统计表 + 质量计分卡。是可检查的快照——每次迭代边界都需重新生成。(为只读,可选。)
state.jsonrostered/extracted/directedprototyped/approved/migrateddeployedverifiedoptimisedcontent-pending已识别Tdashboard/data.jsonstate.jsonInputs
输入项
| Input | Source | Used for |
|---|---|---|
| | the pages to deliver (read-only) |
| | |
| stardust core | (archetypes-only mode) full page roster + |
| rollout / user | DA target coordinates |
| 输入项 | 来源 | 用途 |
|---|---|---|
| | 待交付的页面(只读) |
| | |
| stardust核心 | (仅原型模式) 完整页面清单 + 未迁移页面的 |
| rollout / 用户 | DA目标地址坐标 |
Outputs
输出项
| Path | Purpose |
|---|---|
| per-page delivery ledger (schema: |
| template grouping + roll-ups (schema: |
| the block dedup ledger + EDS mapping (schema: |
| dedup-driven delivery order + per-page convert/reuse briefs |
| multi-source quality findings ledger (schema: |
| quality scorecard + history (schema: |
| config + |
| site-level assembly artifacts |
| self-contained progress dashboard + snapshot |
edits to the EDS project ( | applied by |
| the delivered EDS site | produced by |
rolloutstardust/rollout/autofix-aemstate.jsonmigrated/| 路径 | 用途 |
|---|---|
| 逐页交付台账( schema: |
| 模板分组 + 汇总信息( schema: |
| 区块去重台账 + EDS映射( schema: |
| 基于去重的交付顺序 + 逐页转换/复用指令 |
| 多源质量问题台账( schema: |
| 质量计分卡 + 历史记录( schema: |
| 配置 + |
| 站点级组装 artifacts |
| 独立进度仪表盘 + 快照 |
对EDS项目的修改( | 由 |
| 已交付的EDS站点 | 由 |
rolloutstardust/rollout/autofix-aemstate.jsonmigrated/Dependencies (audit sources — referenced, not vendored)
依赖项(审计数据源——仅引用,未内置)
optimize orchestrates existing audit skills by invocation; they must be installed:
- impeccable (,
critique) — already a stardust dependency.audit - marketing skills — ,
seo-audit,schema,ai-seo. Optional; surface a note if absent.site-architecture - stardust tensions — emitted in-repo by (
extract).brand-review.html
Normalize each one's output into the ledger via . See
.
findings.mjs recordreference/audit-sources.mdoptimize通过调用现有审计技能进行统筹,需确保这些技能已安装:
- impeccable(、
critique)——已作为stardust的依赖项。audit - 营销技能——、
seo-audit、schema、ai-seo。 可选;如果缺失,显示提示信息。site-architecture - stardust tensions——由在仓库内生成(
extract)。brand-review.html
通过将每个数据源的输出标准化至台账。详见。
findings.mjs recordreference/audit-sources.mdWhat rollout does NOT do
rollout不负责的事项
- No upstream redesign. findings are surfaced, not fixed here. autofix only touches platform-fixable findings in the EDS project.
design-pass - No new transport. Delivery is 's DA Source API path, unchanged.
deploy - No redesign of the agnostic core. /
extract/direct/prototypeandmigrateare untouched.deploy - No full pre-migration requirement. Archetypes-only mode is first-class: block
code is deployed from the archetypes; remaining pages advance from
to
content-pendingasdeployedemits their HTML — no rollout restart.migrate
- 不负责上游重新设计。问题仅展示,不在此处修复。自动修复仅处理EDS项目中可通过平台修复的问题。
design-pass - 不新增传输方式。交付使用的DA Source API路径,保持不变。
deploy - 不修改通用核心流程。/
extract/direct/prototype和migrate均保持不变。deploy - 不要求完成预迁移。仅原型模式为一等功能:区块代码从原型页面部署;剩余页面会在生成其HTML文件后自动从
migrate转为content-pending——无需重启rollout流程。deployed
Scripts
脚本说明
- — migrated tree → page + template coverage (idempotent, stale-aware).
scripts/inventory.mjsenables archetypes-only mode.--state <path> - — distinct-block dedup ledger (
scripts/blocks.mjs).blocks.json - — dedup-driven delivery order + per-page convert/reuse briefs.
scripts/plan.mjs - — deterministic delivery state-writer for pages and blocks; re-derives all roll-ups.
scripts/update-coverage.mjs - — source-fidelity gate scaffold (authored sections vs source heading outline; informs the gate, never auto-decides).
scripts/section-fidelity.mjs - — site-level sitemap / robots / fragments manifest.
scripts/assemble.mjs - — full-site structural verification (HTTP or offline
scripts/verify.mjs).--root - —
scripts/optimize.mjsdetectors + the multi-source gate; exits non-zero on open P1.rollout:baseline - — record/resolve findings from the external audit sources.
scripts/findings.mjs - — the AEM autofix engine (edits the EDS project).
scripts/autofix-aem.mjs - — design-identity dashboard +
scripts/dashboard.mjssnapshot.data.json - — shared IO + roll-up + page-loading + autofix-registry helpers.
scripts/lib.mjs
- —— 将已迁移目录树转换为页面 + 模板覆盖范围统计(幂等、支持过期检测)。使用
scripts/inventory.mjs启用仅原型模式。--state <path> - —— 生成唯一区块去重台账(
scripts/blocks.mjs)。blocks.json - —— 生成基于去重的交付顺序 + 逐页转换/复用指令。
scripts/plan.mjs - —— 页面和区块的确定性状态写入工具;自动重新生成所有汇总信息。
scripts/update-coverage.mjs - —— 源内容保真检查脚手架(可编辑板块与源页面标题大纲对比;仅提供检查依据,不自动决策)。
scripts/section-fidelity.mjs - —— 生成站点级站点地图 / robots协议文件 / 片段清单。
scripts/assemble.mjs - —— 全站点结构验证(支持HTTP或离线
scripts/verify.mjs模式)。--root - ——
scripts/optimize.mjs检测器 + 多源质量检查;若存在未解决的P1级问题,返回非零状态码。rollout:baseline - —— 记录/解析来自外部审计数据源的问题。
scripts/findings.mjs - —— AEM自动修复引擎(修改EDS项目文件)。
scripts/autofix-aem.mjs - —— 生成符合设计风格的仪表盘 +
scripts/dashboard.mjs快照。data.json - —— 共享IO + 汇总 + 页面加载 + 自动修复注册工具。
scripts/lib.mjs
References
参考文档
- — design, coverage model, phasing, open questions.
notes/rollout/PLAN.md - — Phase C gates + batched-delivery-at-scale flow.
reference/delivery-gates.md - — metadata contract + query-index mechanics (B2/D2).
reference/dynamic-listings.md - — per-language trees (D3).
reference/multilingual.md - — scaled-rollout gotchas (extend, republish, verify).
reference/operational-learnings.md - — the audit-source → layer → fixability → autofix map.
reference/audit-sources.md - — the
reference/checks.mdcheck catalog.rollout:baseline - — the per-run learnings ledger the report phase writes.
skills/stardust/reference/learnings.md - — the archetype/sibling/thin tier contract Phase C records.
skills/migrate/reference/fidelity-tiers.md - — the image-fidelity resolver's decision table.
skills/migrate/reference/media-reconciliation.md - — the single-page conversion methodology rollout drives.
skills/deploy/SKILL.md - — the DA Source API transport.
skills/deploy/da-deploy-protocol.md - — produces the
skills/migrate/SKILL.md+migrated/inputs._meta.json - — the coverage + config contracts.
schemas/*.schema.json
- —— 设计方案、覆盖模型、阶段划分、待解决问题。
notes/rollout/PLAN.md - —— 阶段C检查 + 大规模批量交付流程。
reference/delivery-gates.md - —— 元数据约定 + 查询索引机制(B2/D2阶段)。
reference/dynamic-listings.md - —— 按语言划分内容树(D3阶段)。
reference/multilingual.md - —— 大规模部署的常见陷阱(扩展、重新发布、验证)。
reference/operational-learnings.md - —— 审计数据源 → 层级 → 可修复性 → 自动修复映射。
reference/audit-sources.md - ——
reference/checks.md检查目录。rollout:baseline - —— 报告阶段写入的每次部署经验台账。
skills/stardust/reference/learnings.md - —— 阶段C记录的原型/同模板/简洁层级约定。
skills/migrate/reference/fidelity-tiers.md - —— 图片保真度解析器的决策表。
skills/migrate/reference/media-reconciliation.md - —— rollout调用的单页转换流程。
skills/deploy/SKILL.md - —— DA Source API传输协议。
skills/deploy/da-deploy-protocol.md - —— 生成
skills/migrate/SKILL.md+migrated/输入项的流程。_meta.json - —— 覆盖范围 + 配置约定。",
schemas/*.schema.json