Files
whynot-design/adapters/lit/drift/_report.json
tegwick 05fa31e2b5
Some checks failed
ci / check (push) Has been cancelled
ci / release (push) Has been cancelled
fix(adapter): resolve all WHYNOT-WP-0002 drift — designbook-refresh green
Triage the three surfaced divergences the governance-correct way (no stack->React
back-edit, no ir/ hand-edit); make adapt-lit/parity-lit/designbook-refresh now
exit 0:

- PipelineStrip: documented TAG_OVERRIDES in scripts/ir-extract.mjs maps the
  React 'PipelineStrip' to the established tag wn-pipeline (the web-component tag
  is an IR-projection detail, not React-dictated; the component name stays
  faithful). Tag now matches the element; parity tests it (no longer skipped).
- PageHeader.actions: the drift detector now collects each element's named slots
  and treats an IR prop honoured by a same-named slot (<slot name="actions">) as
  satisfied (prop-via-slot, informational) rather than prop-missing.
- Sidebar.current: recorded as an auditable accepted divergence in
  adapters/lit/drift.accepted.json (React monolithic 'current' key vs Lit per-item
  'active' on composable <wn-sidebar-item>) — listed, downgraded to info, not gated.

Rendered surfaces (src/, examples/) untouched — verified zero diff; parity renders
all 10 components green. Adapt/parity outputs idempotent (stable re-run).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:53:59 +02:00

224 lines
6.6 KiB
JSON

{
"stack": "lit",
"generatedAt": "2026-06-30T07:46:35.458Z",
"irRef": "756634c",
"components": [
{
"name": "Button",
"status": "ok",
"tag": "wn-button",
"issues": [
{
"kind": "non-portable",
"prop": "onClick",
"detail": "type=function; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
},
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "size",
"detail": "on <wn-button> (attribute 'size'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "iconEnd",
"detail": "on <wn-button> (attribute 'icon-end'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "type",
"detail": "on <wn-button> (attribute 'type'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "disabled",
"detail": "on <wn-button> (attribute 'disabled'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "href",
"detail": "on <wn-button> (attribute 'href'), not in IR contract.",
"severity": "info"
}
]
},
{
"name": "Eyebrow",
"status": "ok",
"tag": "wn-eyebrow",
"issues": [
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "strong",
"detail": "on <wn-eyebrow> (attribute 'strong'), not in IR contract.",
"severity": "info"
}
]
},
{
"name": "Icon",
"status": "ok",
"tag": "wn-icon",
"issues": [
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
}
]
},
{
"name": "PageHeader",
"status": "ok",
"tag": "wn-page-header",
"issues": [
{
"kind": "prop-via-slot",
"prop": "actions",
"detail": "IR prop honoured by <slot name=\"actions\"> on <wn-page-header> (slotted content, not an attribute).",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "hasActions",
"detail": "on <wn-page-header> (attribute 'hasactions'), not in IR contract.",
"severity": "info"
}
]
},
{
"name": "PipelineStrip",
"status": "ok",
"tag": "wn-pipeline",
"issues": [
{
"kind": "prop-extra",
"prop": "stages",
"detail": "on <wn-pipeline> (attribute 'stages'), not in IR contract.",
"severity": "info"
}
]
},
{
"name": "Sidebar",
"status": "ok",
"tag": "wn-sidebar",
"issues": [
{
"kind": "prop-missing",
"prop": "current",
"detail": "in IR (attribute 'current'), absent on <wn-sidebar>",
"severity": "info",
"accepted": "Composition divergence (intentional). The React Sidebar is monolithic and takes a `current` selection-key prop, comparing it against its own internal NAV_ITEMS. The Lit stack decomposes the sidebar into <wn-sidebar> + <wn-sidebar-group> + <wn-sidebar-item>, modelling selection as per-item `active` state on the slotted children rather than a container-level key. There is no single `current` attribute to honour on <wn-sidebar>; the contract is satisfied compositionally. Reconcile upstream only if the React designbook is ever made composable."
},
{
"kind": "non-portable",
"prop": "onNav",
"detail": "type=function; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
},
{
"kind": "variant-axis-missing",
"prop": "current",
"detail": "IR variant axis 'current' (doc:) has no Lit property.",
"severity": "info",
"accepted": "Same composition divergence as Sidebar.current above — the `current` variant axis is expressed as item-level `active` on <wn-sidebar-item>, not as a <wn-sidebar> property."
},
{
"kind": "prop-extra",
"prop": "activation",
"detail": "on <wn-sidebar> (attribute 'activation'), not in IR contract.",
"severity": "info"
}
]
},
{
"name": "StageDot",
"status": "ok",
"tag": "wn-stage-dot",
"issues": [
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
}
]
},
{
"name": "Stamp",
"status": "ok",
"tag": "wn-stamp",
"issues": [
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
}
]
},
{
"name": "Tag",
"status": "ok",
"tag": "wn-tag",
"issues": [
{
"kind": "non-portable",
"prop": "style",
"detail": "type=object; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
}
]
},
{
"name": "TopNav",
"status": "ok",
"tag": "wn-top-nav",
"issues": [
{
"kind": "non-portable",
"prop": "onNew",
"detail": "type=function; not attribute-mappable — handle explicitly, never drop.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "logoSrc",
"detail": "on <wn-top-nav> (attribute 'logo-src'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "brand",
"detail": "on <wn-top-nav> (attribute 'brand'), not in IR contract.",
"severity": "info"
},
{
"kind": "prop-extra",
"prop": "slug",
"detail": "on <wn-top-nav> (attribute 'slug'), not in IR contract.",
"severity": "info"
}
]
}
]
}