* fix(stardust): make migrate output genuinely zip-and-deploy portable
The 0.7.0 contract claimed "self-contained, zip-and-deploy" but
emitted root-absolute paths (/assets/..., /beers/) plus
directory-only nav links. Those work on a webserver at the host
root only — they 404 on file:// and at any subpath. This PR
delivers what the claim promised:
- Output path is URL-literal: /beers/ -> beers/index.html,
/about-us/history.html -> about-us/history.html. No more
synthesizing /about/index.html from a slug.
- Page map (state.json.migrate.pageMap[]) built once per run;
per-page rendering and internal-link rewriting both consume it.
- Reference shape is depth-aware relative: prefix is ./ for
depth-0 pages, ../ * depth otherwise. Works on file://, at
host root, and at any subpath without rewriting.
- Phase 3 broadens the self-containment check into a full
portability audit: refuses absolute internal refs, refuses
directory-only nav, runs the new pageMap + file:// fixtures.
- New fixtures: file-protocol-audit.mjs (Playwright file://
round-trip) and pagemap-audit.mjs (static pageMap consistency).
- asset-bundling.md and migrate-output-format.md aligned to the
new depth-aware-relative shape; state.json contract gains
pageMap[].
Plugin bumped 0.7.0 -> 0.7.1.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* review: fix four flagged correctness issues
- Directory-only-nav regex now catches `./beers/` (the cited example).
Old pattern required a-z as first char; `./beers/` starts with `.`
and would have slipped through. New pattern accepts ./, ../, /, or a
bare segment, and excludes scheme-bearing URLs (no false positive
on https://google.com/).
- Add a second grep for absolute url() references inside inline style
attrs and <style> blocks (and CSS files); the original href/src grep
missed these.
- SKILL.md Outputs row no longer claims the sidecar lives at
<source-url-path>/_meta.json (nonsense for .html-leaf pages).
Replaced with a row that points at the canonical sidecar rule.
- migration-procedure.md § Page map now explicitly says same-origin
absolute URLs are stripped to their path portion before pageMap
lookup (per content-preservation.md § Internal link rewriting),
closing the loophole that would let <a href="https://origin/foo/">
pass through verbatim.
Regex patterns verified against a test fixture before commit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* review: update migrate-self-contained-bundle eval to 0.7.1 contract
The eval was pinned to 0.7.0's root-relative /assets/<subpath>
shape. This PR's contract change to depth-aware relative paths
would have made the eval fail against correct 0.7.1 output.
- detection_src_href criterion now asserts <prefix>assets/<subpath>
(not /assets/<subpath>).
- Renamed prefix_resolution_root_relative -> prefix_normalises_authoring;
description flipped from "reference is left as-is" to "authoring
is normalised to the depth-aware emit form".
- Added 4 new criteria: depth_aware_paths (6pts),
pagemap_constructed (6pts), internal_links_via_pagemap (5pts),
portability_audit_passes (13pts).
- Setup uses real source URLs that exercise the URL-literal rule:
/, /beers/, /about/history.html (preserve .html leaf),
/docs/api/ (depth-2 nested).
- Prototype HTML now carries internal nav in three authoring styles
(root-absolute, same-origin absolute, directory-only) plus a
broken-link case, exercising the page map rewrite.
- Run 1 expected behavior rewritten to expect depth-aware emission
('./assets/...'), pageMap built before render, broken-link
flagging, and the 6-step portability audit passing.
- Run 4 (cross-page dedup) updated so the second page emits its
shared asset with its own '../' prefix while the underlying file
on disk is a single copy.
- Weights re-balanced to sum to 100; portability_audit_passes gets
the largest weight (13pts) since it backs the contract claim.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* feat(stardust): migrate produces self-contained zip-and-deploy bundle
Bundles every referenced asset into stardust/migrated/assets/ and
rewrites HTML/CSS references to root-relative /assets/<subpath> so
the migrated tree is fully self-contained. Adds asset-bundling
reference (six detection shapes, nine edge cases), output-format
contract with state.json.migrate block (selfContained: true),
--clean and --pin-timestamp flags, and an eval covering the six
acceptance criteria.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* review: fix count, --clean correctness, document asset-missing rename
- Bump totalAssetsBundled 6 → 7 in eval task.md (matched bundledAssets[] length).
- --clean now implies --force so the bundledAssets Set is the complete
union across every page; idempotent-skipped pages' assets are no
longer at risk of being deleted as stale. Updated SKILL.md flag
description, asset-bundling.md § Stale asset cleanup, the
Idempotent-skip interaction note, and the eval's run-3 expected
behaviour + criterion.
- Document the contentDeviations / migrationDecisions kind rename
from "media-missing" to "asset-missing" in
migrate-output-format.md § Backwards compatibility — consumers
should accept either string until they migrate.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(stardust): bump plugin version 0.6.0 → 0.7.0
Self-contained zip-and-deploy bundle is a minor-version addition:
new --clean and --pin-timestamp flags, new state.json migrate
block (forward-compat), new asset-bundling reference contract,
provenance kind rename (media-missing → asset-missing).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(stardust): bump palette library version v0.6.0 → v0.7.0
Keep the palette library version aligned with the plugin version.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Coordinated three-part change: Part I adds a strategic ia-fidelity
axis pinned at direct time (verbatim → A1/A2/A3 surface forks vs
reimagined → A+B+C role-differentiated). Part II adds 10 disciplines
at three phase boundaries (brief-time 1-5, craft-time 6-8, quality
gates 9 + convergence detector 10) with the four wasatch dry-run
friction carve-outs folded in. Part III lands Phase 5 approval
fold-back (site-wide / page-local / don't-fold) with verbatim no-op
gating. Also sweeps remaining Phase 5.5 → 2.7 references across the
plugin docs.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(aem-workflow): correct workflow-model-design XML format for /conf design-time (AEMaaCS)
The cloud-service workflow-model-design skill incorrectly showed
cq:WorkflowModel / cq:WorkflowNode / cq:WorkflowTransition (runtime
/var format) under the /conf design-time path. The Workflow Model
Editor expects cq:Page + jcr:content/flow/<step-component> with
nt:unstructured step nodes and sling:resourceType identifiers.
A developer following the previous content would deploy a model the
editor cannot open and Sync cannot process.
Verified against AEM Cloud Service SDK localhost:4517 OOTB models at
/libs/settings/workflow/models/ and source at com.adobe.granite.workflow
on master branch.
- model-xml-reference.md: full rewrite to cq:Page + flow/parsys
format; design-time vs runtime table; cq:template fix to
/libs/cq/workflow/templates/model; rewritten pitfalls section;
runtime /var shape documented for reference
- step-types-catalog.md: every step snippet converted to
nt:unstructured + sling:resourceType; sling:resourceType reference
table added; initiatorparticipant documented; transition XML
removed (Sync derives transitions from step order)
- model-design-patterns.md: Pattern 5 Task Manager XML corrected to
flow-layer format; Pattern 6 variables annotated as runtime-only
- SKILL.md: Sync verification added to checklist; /conf-only on
AEMaaCS distinction (no /etc legacy auto-deploy); filter.xml
guidance updated
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(aem-workflow): correct AND_SPLIT/AND_JOIN/END resourceTypes in workflow-model-design (AEMaaCS)
The cloud-service step-types-catalog listed sling:resourceType values
for AND_SPLIT, AND_JOIN, and END that do not exist as design-time
components on AEM Cloud Service. Verified against
/libs/cq/workflow/components/model/ on localhost:4517.
- sling:resourceType table: AND_split -> and (actual OOTB component
is named `and`, not `AND_split`); AND_join and end rows removed
(no such components exist)
- AND_SPLIT example: corrected sling:resourceType to
cq/workflow/components/model/and; AND_JOIN inline example removed
- AND_JOIN section: replaced manual <synchronize> example with note
that AEM Sync derives AND_JOIN nodes automatically at /var
- END Node section: replaced manual <workflowend> example with note
that Sync derives both START and END automatically
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Align with the updated MCP server which split fetch-cam-bpa-findings
into two purpose-specific tools:
- fetch-cam-bpa-findings-by-pattern: code-transformer pattern flows
(scheduler, assetApi, eventListener, resourceChangeListener, eventHandler)
- fetch-cam-bpa-findings-by-importance: returns authoritative _COUNT_
rollup rows at one importance level (CRITICAL/MAJOR/ADVISORY/INFO),
sorted by descending count — for open-ended "what are the critical
findings?" requests
Changes:
- cam-mcp.md: rename all references; add full Tool section for
fetch-cam-bpa-findings-by-importance (request, response shape,
backend endpoint, error response note)
- SKILL.md: update CAM via MCP summary and batching section to name
both tools with their respective use cases
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The MCP cam-bpa-fetcher now returns success:true with an empty targets
array and a message field when a specific pattern has no findings in the
latest BPA report, instead of success:false with a misleading "upload
BPA report" suggestion.
Align the skills layer:
- BpaResult gains a message field (unified-collection-reader.js)
- bpa-findings-helper caches and propagates mcp.message so callers see
"No 'scheduler' findings in the latest BPA report for project X"
rather than the generic cache message when targets are empty
- cam-mcp.md documents the new message field on the success response
and splits the empty-targets behavior table row into the two distinct
cases (success:true specific-pattern vs success:false all-pattern)
- New test verifies message propagation, cache write, and no re-fetch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(stardust)!: sweep — drop doctor.md, F-NNN fossils, opt-out flags, live integration
Four related cleanups bundled. Each independently small; together
they shrink the docs by ~600 lines and remove three doc-rot
patterns at once.
1. Delete doctor.md (493-line spec for an unimplemented script).
The Festool-incident concerns it was scoped to are now handled
by concrete write-time contracts (validateProvenance, content-
sourcing hierarchy, anti-toolbox audit). No external references.
2. Drop F-NNN feedback fossils + version-changelog paragraphs.
STARDUST-FEEDBACK.md doesn't exist in the plugin; the F-001 /
F-002 / F-009 / F-015 / F-016 / F-018 citations were opaque
tribal vocabulary. Kept the rules they cited; dropped the
IDs. divergence-toolkit.md changelog paragraphs (v0.1 → v0.2,
v0.4 → v0.5, v0.5 → v0.5.1) collapsed.
3. Slim flag surfaces. Every --no-* / --skip-* / --allow-* /
--refresh-stale flag dropped from prototype and migrate; the
underlying quality gates are now mandatory. Manual chat
overrides ("ship as-is", "accept the P1 findings") remain
available and are recorded in _provenance verbatim.
prototype flags: 10 → 5 (<slug>, --all, --prep, --canon-from,
--publish-sample).
migrate flags: 8 → 5 (<slug>, --all, --force, --require-approved,
--strict-canon).
4. Drop the impeccable:live integration. Live was documented as
the "default" iteration path but wasn't used — chat-driven
command invocation is the actual default. Phase 4 collapses
from 6 steps to 3 (open file → mark prototyped → report).
Iteration paths drop from 3 to 2 (chat-driven, direct
invocation). Live remains usable as an external tool the user
invokes directly against the proposed file; stardust no
longer pretends to drive its poll loop.
BREAKING CHANGE: prototype no longer accepts --no-iterate,
--no-critique, --skip-adapt-audit, --adapt-variant, --no-hamburger,
--refresh-stale, or --no-impeccable. migrate no longer accepts
--refresh-stale, --allow-placeholder, or --skip-adapt-audit.
The mobile-adapt audit, content-sourcing scan, placeholder gate,
and critique + audit pass are now mandatory; manual chat overrides
replace the flag-based bypasses.
The live driver loop (Phase 4 steps 4-6: config.json setup, event
streaming, carbonize cleanup, iteratedVia: impeccable:live
provenance) is gone. The proposed file's iteratedVia provenance
now records the named impeccable commands run against the file,
not a live sessionId.
stardust bumped to 0.6.0.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(stardust): sync tile.json version to plugin.json (0.6.0)
The tile manifest's version was stuck at 0.1.0 while the plugin
moved to 0.6.0. Keep them in sync so tessl-side catalog metadata
matches the marketplace.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* stardust: mobile-nav collapse pattern + drop before/after viewer
Two related changes to stardust:prototype landing together.
Mobile-nav collapse (additive):
- New stock CSS-only hamburger pattern auto-applied by Phase 5.5
when the Mobile-adapt audit refuses at 360px (overflow,
sub-11px nav font, or sub-10px nav gap).
- New audit conditions documented in skills/prototype/SKILL.md
§ Mobile-adapt audit; checked at runtime via the Playwright
snippet at skills/prototype/fixtures/mobile-nav-audit.mjs.
- Stock pattern doc at skills/prototype/reference/mobile-nav-collapse.md
carries the copy-pasteable HTML+CSS+JS, the ARIA checklist,
the post-injection source-order check, --no-hamburger opt-out,
and the alternative-pattern vocabulary.
- New data-nav-collapse="hamburger" attribute (v2.2 additive) on
<header> when the pattern is applied.
- Positive + negative fixtures verify the audit end-to-end.
Drop the per-page before/after viewer:
- Phase 3 (Compose the viewer) removed; the proposed file is
opened directly in the browser.
- Approval is now chat-only: "approve <slug>" or "approve".
- skills/prototype/reference/before-after-shell.md renamed to
proposed-file-shell.md and stripped to the proposed-file
contract only (viewer half, iframe resolution chain, action
buttons, and stash mechanic all dropped).
- state-machine.md prototypePath repointed at -proposed.html;
doctor.md D-104 pairs -proposed.html with -shape.md;
artifact-map.md drops the <slug>.html row; publish-sample.md
simplifies variant discovery (no more "is not the viewer"
disambiguation); evals/prototype-before-after rewritten to
expect a single proposed file.
BREAKING CHANGE: stardust:prototype no longer composes the
before/after viewer at stardust/prototypes/<slug>.html.
Anyone scripting on top of that file existing on disk should
switch to stardust/prototypes/<slug>-proposed.html (the
prototypePath in state.json now points there directly). The
approval gesture moves from the viewer's Approve button to a
chat-only "approve <slug>" / "approve".
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* stardust: bump version to 0.5.0
Minor bump for the breaking change in 370a208 (drop before/after
viewer; chat-only approval). Pre-1.0 semver: minor bump signals
a breaking change without claiming API stability.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
The `marketplace` field in plugin dependencies and the
`allowCrossMarketplaceDependenciesOn` allowlist must use the
marketplace's `name` (`impeccable`), not its GitHub repo path
(`pbakaus/impeccable`). The mismatch caused Claude Code to flag
the stardust plugin manifest as invalid on install.
Bumped to 0.4.1.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(aem-workflow): correct workflow-model-design XML format for /conf design-time (AEM 6.5 LTS)
The workflow-model-design skill incorrectly showed cq:WorkflowModel /
cq:WorkflowNode / cq:WorkflowTransition (runtime /var format) under the
/conf design-time path. The Workflow Model Editor expects cq:Page +
jcr:content/flow/<step-component> with nt:unstructured step nodes and
sling:resourceType identifiers. A developer following the previous
content would deploy a model the editor cannot open and Sync cannot
process.
Verified against AEM 6.5 LTS localhost:4505 OOTB models at
/libs/settings/workflow/models/ and source at
WorkflowSessionFactory.java:94 (MODELS_RUNTIME_LOCATION = "/var/workflow/models").
- model-xml-reference.md: full rewrite to cq:Page + flow/parsys
format; design-time vs runtime table; cq:template fix to
/libs/cq/workflow/templates/model; rewritten pitfalls section;
runtime /var shape documented for reference
- step-types-catalog.md: every step snippet converted to
nt:unstructured + sling:resourceType; sling:resourceType reference
table added; initiatorparticipant documented; transition XML
removed (Sync derives transitions from step order)
- model-design-patterns.md: Pattern 5 Task Manager XML corrected to
flow-layer format; Pattern 6 variables annotated as runtime-only
- SKILL.md: Sync verification added to checklist; /conf vs /var
distinction note; filter.xml guidance updated
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(aem-workflow): correct AND_SPLIT/AND_JOIN/END resourceTypes in workflow-model-design (AEM 6.5 LTS)
The step-types-catalog incorrectly listed sling:resourceType values for
AND_SPLIT, AND_JOIN, and END that do not exist as design-time
components on AEM 6.5 LTS. Verified against
/libs/cq/workflow/components/model/ on localhost:4505.
- sling:resourceType table: AND_split -> and (the actual OOTB
component is named and, not AND_split); AND_join and end rows
removed (no such components exist)
- AND_SPLIT example: corrected sling:resourceType to
cq/workflow/components/model/and; AND_JOIN inline example removed
- AND_JOIN section: replaced manual <synchronize> example with a note
that AEM Sync derives AND_JOIN nodes automatically at /var
- END Node section: replaced manual <workflowend> example with a note
that Sync derives both START and END automatically
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(stardust): close open clusters — publish-sample URL, mobile-adapt phase, critique+audit, add-variant
Four items from the 2026-05-05 review session covering UPS F7+F9,
NVIDIA F8, and dogfood-feedback 2026-05-03-a / JFK F14. All four
shipped together because they overlap in the same SKILL files.
- publish-sample showcase URL fix (UPS F9): the printed URL pattern
pointed at a route that doesn't exist (samples/<slug>/), so every
published sample carried a broken link in the PR body and final
report. Updated to the actual single-page-viewer route
(samples/brand.html?slug=<slug>#<variantId>) and synced the upstream
default to paolomoz/stardust-site.
- Mobile-adapt as a pipeline phase (dogfood-feedback 2026-05-03-a +
JFK F14): new prototype Phase 5.5 runs $impeccable adapt against
the approved variant on every approval; mobile-adapt audit at
prototype, migrate, and publish-sample refuses files with no
<meta viewport>, zero @media (max-width: ...) rules, or no
mobile-targeted breakpoint at <= 640px. --skip-adapt-audit escape
hatch threads through all three. Closes the failure mode where
the lovesac.com showcase shipped variant B to mobile visitors with
bracket motif crowding, overflowing trust band, and no hamburger.
- Phase 2.5 critique + audit (NVIDIA F8): renamed from "Validate via
critique" to "Validate via critique + audit"; runs both impeccable
validators in parallel and gates prototyped status on P0/P1 from
either. Added brand-faithful inversion auto-dismiss against
DESIGN.json#extensions.divergence.brand_faithful_inversions[] so
Mode A renders don't drown the report in known false positives
(Arial fallback flagged as overused-font, eyebrow uppercase as
all-caps body, etc.). publish-sample's submitter checklist updated
to cover both validators.
- direct --add-variant <name> (UPS F7): incremental variant addition
against the existing direction without re-running Phase 1 reasoning
or stale-flagging existing prototypes. Procedure documented; per-
field inheritance rules table specifies what's pinned (palette,
typography, IA-priorities), what extends (componentStyle, divergence
inversions), and what's variant-local (narrative, voice DOs, the
amplified-trait anchor). Fixes the workflow where variant A ships,
user later asks for B and C, and --re-direct is too heavy.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(stardust): declare cross-marketplace dependency on impeccable
Whitelist pbakaus/impeccable in marketplace.json and declare it as a
dependency in stardust's plugin.json so stardust can formally depend on
the impeccable plugin hosted in a different marketplace.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* fix(replicate-content): condense SKILL.md to pass tessl-review (#117)
Rewrites replicate-content/SKILL.md from 840 lines to ~150 lines and
adds three reference files so the skill passes the 50% tessl-review
threshold.
Changes:
- Description: add explicit "Use when..." clause and trigger terms
(publish, unpublish, replicate, content activation, dispatcher flush,
AEM publish instance) to improve specificity and completeness scores
- Body: condense all seven replication methods to 3-5 lines each with
explicit ✓ Verify checkpoints; remove generic Best Practices,
Security Considerations, and Success Criteria sections
- Split detailed walkthroughs into references/ bundle files:
- references/TREE_ACTIVATION.md (dry-run steps, performance guidance)
- references/PACKAGE_REPLICATION.md (full package build/replicate flow)
- references/REPLICATION_API.md (Java API, ReplicationOptions,
curl with error handling, service user setup)
Fixes#117
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(replicate-content): address quality review findings
- CRITICAL: replace invalid XML service-user mapping with correct OSGi
JSON config format (.cfg.json) in REPLICATION_API.md
- HIGH: add REVERSE to ReplicationActionType table (was missing)
- HIGH: add replication-api to Related Skills in SKILL.md
- MEDIUM: add Only Activated option to Tree Activation summary to match
TREE_ACTIVATION.md reference file
- MEDIUM: fix head -n1 → sed '$d' in production curl script to handle
multiline JSON responses without truncation
- MEDIUM: add brief Asset Replication (DAM) section to SKILL.md
- LOW: add Additional Resources section with official Adobe docs links
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Abhishek Garg <abhigarg+adobe@adobe.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add missing version/summary fields and convert skill paths from strings
to objects to match the required tile.json schema.
- tessl-lint rejects colons in skill names; only lowercase letters,
numbers, and hyphens are allowed.
- Skill keys must match the name field in each SKILL.md; drop the
stardust- prefix since the SKILL.md files declare short names.
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tighten aem-rde activation: explicit RDE references only; add do-not-activate guard for generic AEMaaCS phrases (cloud sandbox, dispatcher-config/frontend/env-config, push my bundle, tail the publish log) that belong to Cloud Manager pipelines
- Mark skill as beta per project conventions: [BETA] prefix in description with caveat, metadata.status: beta in frontmatter, and a beta-skill blockquote in the body
- Reflect beta status in README entry
- Update aem-cloud-service plugin.json description and keywords to mention RDE for discoverability
- Add aem-rde skill section to README.md for human and AI agent discovery
- Document single-user RDE constraint in references/configuration.md
Introduces a new plugin 'aem-cloud-service' to host AEMaaCS / Cloud
Manager related skills, separate from the existing
'aem-edge-delivery-services' grouping. Adds the 'aem-rde' skill which
provides expert guidance on '@adobe/aio-cli-plugin-aem-rde' commands:
deploy, inspect, log-tail, snapshot, and troubleshoot Rapid Development
Environments.
Four items from the 2026-05-05 review session covering UPS F7+F9,
NVIDIA F8, and dogfood-feedback 2026-05-03-a / JFK F14. All four
shipped together because they overlap in the same SKILL files.
- publish-sample showcase URL fix (UPS F9): the printed URL pattern
pointed at a route that doesn't exist (samples/<slug>/), so every
published sample carried a broken link in the PR body and final
report. Updated to the actual single-page-viewer route
(samples/brand.html?slug=<slug>#<variantId>) and synced the upstream
default to paolomoz/stardust-site.
- Mobile-adapt as a pipeline phase (dogfood-feedback 2026-05-03-a +
JFK F14): new prototype Phase 5.5 runs $impeccable adapt against
the approved variant on every approval; mobile-adapt audit at
prototype, migrate, and publish-sample refuses files with no
<meta viewport>, zero @media (max-width: ...) rules, or no
mobile-targeted breakpoint at <= 640px. --skip-adapt-audit escape
hatch threads through all three. Closes the failure mode where
the lovesac.com showcase shipped variant B to mobile visitors with
bracket motif crowding, overflowing trust band, and no hamburger.
- Phase 2.5 critique + audit (NVIDIA F8): renamed from "Validate via
critique" to "Validate via critique + audit"; runs both impeccable
validators in parallel and gates prototyped status on P0/P1 from
either. Added brand-faithful inversion auto-dismiss against
DESIGN.json#extensions.divergence.brand_faithful_inversions[] so
Mode A renders don't drown the report in known false positives
(Arial fallback flagged as overused-font, eyebrow uppercase as
all-caps body, etc.). publish-sample's submitter checklist updated
to cover both validators.
- direct --add-variant <name> (UPS F7): incremental variant addition
against the existing direction without re-running Phase 1 reasoning
or stale-flagging existing prototypes. Procedure documented; per-
field inheritance rules table specifies what's pinned (palette,
typography, IA-priorities), what extends (componentStyle, divergence
inversions), and what's variant-local (narrative, voice DOs, the
amplified-trait anchor). Fixes the workflow where variant A ships,
user later asks for B and C, and --re-direct is too heavy.
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* feat(stardust): provenance integrity — synthesis guard, cascade validation, full body capture
Closes a class of silent corruption where extract --prep silently
synthesized page records and the cascade ran four phases on
fabricated data before being caught by a meta-question
(2026-04-30 lovesac.com).
- extract refuses to mark a page extracted without renderedBy:"playwright"
+ fetchedAt + waitMs>0 + waitMode + httpStatus; new ProvenanceMissing
error class; sub-agent prompts must forbid synthesis by name and return
a per-page evidence table.
- validateProvenance(page) specced in state-machine.md; called at setup
of direct --prep, prototype, migrate; cascade guard runs between
prepare-migration Phase 1 and Phase 2 with explicit abort message.
- innerText captured in full — no truncation. Reference scripts must
not slice (the v0.2 .slice(0, 4000) silently dropped most body content
on long-form pages and broke module detection downstream).
- Schema additions for sections[].body, lists, qa, quotes so migrate can
render real body copy under each heading instead of falling back to
placeholder-with-signature throughout.
- Mandatory per-page evidence table in extract Phase 6 with live: yes/no
column; Provenance: N/N live line in prep summary so the contract is
visible at a glance.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(stardust): extract reliability — Akamai headed fallback + consent pre-flight
Two unrelated context-setup gaps surfaced in 2026-05-03/04 dogfood
that silently produced bad captures.
- Bot-management fallback (UPS, ups.com/gb): Akamai rejects bundled-
chromium-default headless on its TLS/H2 fingerprint with
ERR_HTTP2_PROTOCOL_ERROR, before any JS runs. Recipe now specifies
headless: false, channel: 'chrome' as the retry path; playwright-
recipe.md gains a Bot-management fallback section, extract setup
switches modes on the protocol error without retrying headless,
and the in-page fetch pattern is documented for sub-resource
fetches that need to inherit the JA3 fingerprint.
- Consent banner pre-flight (NVIDIA, nvidia.com): every page's
screenshot was overlaid by the OneTrust banner and the voice
table was dominated by 'Manage Settings' / 'Reject All' /
'Accept All' once-per-page. Recipe now specifies an API-first
dismissal (OneTrust / Cookiebot / Didomi / Osano) with selector
fallbacks, --no-consent-dismiss opt-out, and consent.method
recorded in _crawl-log.json. Side-effect caveat documented: the
dismissal can activate other gated scripts (analytics, geo-IP,
A/B) and the result may differ from a no-dismiss capture.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(stardust): extract capture fidelity — fonts, icon font, CSS-bg pseudo, hero image, logo rect-filter
Five capture-fidelity gaps surfaced across the 2026-04-29 → 2026-05-04
dogfood window. Each silently produced a thinner or wrong brand surface
that downstream prototypes then rendered against.
- Logo locator step 2 (UPS): rect filter (height ≥ 32, width ≥ 40,
top ≤ 200) + aspect filter [0.5, 3.0] + rank by proximity to 1.5
ideal. Stops promotional icons that share the brand-name substring
from being picked as the masthead logo.
- CSS-background hero (UPS): pseudo-element walk on ::before / ::after
generated content, which document.querySelectorAll('*') doesn't
reach. Performance-bounded by the prior visible-size filter.
- voice.heroImage elevation (UPS): single canonical hero per home,
resolved by viewport-top + visible-area + aspect-ratio filters
with explicit DOM > CSS-bg > pseudo tie-breakers. Ends downstream
re-derivation from a 16-image list.
- Font file capture via network-intercept (JFK): every woff2/ttf/otf
saved to assets/fonts/, recorded in _brand-extraction.json#type.files[]
with @font-face metadata + licensing flag. Closes the gap where
Mode A prototypes silently fall back to system-ui on private-cut
brands.
- Icon-font detection (JFK): query [class^="icon-"] + ::before
font-family + codepoint, build iconClass → codepoint table, save
the font file. Closes the emoji-fallback render path on
Chakra/Material/government sites.
- Module-detection signal priority (sliccy): explicit ranking —
headings → CTAs → cssBackgrounds → forms → componentsByLandmark
→ innerText substring. Substring search drops to corroboration
only; was the source of the 2026-04-29 under-detection.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
v1 (four-stage greenfield: brand → briefings → wireframes → prototype) is
preserved at tag stardust--v0.1.0. v0.3.0 is a complete refactor with a
new surface (extract → direct → prototype → migrate) and a hard runtime
dependency on impeccable.
- plugins/stardust: replace contents with v0.3.0 source from paolomoz/stardust-2
(skills, evals, README, tile.json, plugin.json)
- plugins/stardust/.claude-plugin/plugin.json: bump to 0.3.0; add repository
and v2-relevant keywords
- plugins/stardust/skills/*/SKILL.md: add license: Apache-2.0 to frontmatter
- .claude-plugin/marketplace.json: update stardust entry with new
description, version, category, keywords, author, homepage, repository,
license (mirrors adobe-for-creativity entry shape)
- plugins/stardust/README.md: status bumped to v0.3.0; v1 link repointed
to the stardust--v0.1.0 tag
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Renames resources/ to references/ across 8 skills to match the
agentskills.io spec — every other plugin in this repo and EDS's own
ue-component-model already use references/.
Converts backtick-quoted resource paths in SKILL.md to markdown links
so tessl lint sees them as reachable from manifest entrypoints,
eliminating all 17 orphan warnings. Also fixes two pre-existing broken
cross-skill references that pointed at ../page-import/resources/...
(no such directory); the actual file lives in
content-driven-development/references/.
Adds a markdown link in code-review/SKILL.md to its previously
unreferenced references/review-checklist.md.
Per Anthropic's agent skills spec, markdown links don't trigger eager
loading — Claude reads SKILL.md, sees the link, decides on demand
whether to follow it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Suppresses tessl lint warnings about CHANGELOG.md and package.json
files that exist as semantic-release / semantic-release-monorepo
artifacts but are not skill content.
Negation pattern preserves package.json files under scripts/ so that
future skills shipping node script tools have their packaging metadata
bundled correctly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two skills existed in the skills/ directory but were absent from
tile.json, so tessl never saw them. Adds both to the skills map and
creates the missing package.json for ue-component-model so the release
workflow can pick it up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>