* 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>
Posts a sticky comment to the PR Conversation tab summarizing per-tile
lint results. Comment is identified by an HTML marker and updated
in-place across pushes (Codecov-style), so a PR has at most one
tessl-lint comment regardless of push count.
Per-tile warnings are shown inside collapsible <details> blocks so the
comment stays compact. Failing tiles get a top-level error block plus
the standard ::error:: annotation, keeping the check status red.
Adds pull-requests: write permission for comment posting.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Promotes per-tile warning-count annotations from ::notice:: (blue ℹ️)
to ::warning:: (yellow ⚠️) so they're more visible in the PR
Conversation tab and Files Changed tab. Still doesn't fail the check —
GitHub has no "warning" check status, only success/failure/neutral.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Runs tessl skill lint on every PR and push to main, scoped to changed
tiles (parents of tile.json) following the same discovery pattern as
tessl-eval.yml. Push to main lints all tiles.
Fails CI on lint errors (non-zero exit). Lint warnings (orphan files,
oversized SKILL.md, etc.) are surfaced as GitHub Annotations and step
summary entries but do not fail the build, since they are informational
not blocking.
No TESSL_TOKEN required — lint is local validation, so it works on
fork PRs unlike eval/review.
Co-Authored-By: Claude Opus 4.7 (1M context) <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>