feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
{
"stack" : "lit" ,
2026-06-30 09:53:59 +02:00
"generatedAt" : "2026-06-30T07:46:35.458Z" ,
"irRef" : "756634c" ,
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
"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" ,
2026-06-30 09:53:59 +02:00
"status" : "ok" ,
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
"tag" : "wn-page-header" ,
"issues" : [
{
2026-06-30 09:53:59 +02:00
"kind" : "prop-via-slot" ,
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
"prop" : "actions" ,
2026-06-30 09:53:59 +02:00
"detail" : "IR prop honoured by <slot name=\"actions\"> on <wn-page-header> (slotted content, not an attribute)." ,
"severity" : "info"
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
} ,
{
"kind" : "prop-extra" ,
"prop" : "hasActions" ,
"detail" : "on <wn-page-header> (attribute 'hasactions'), not in IR contract." ,
"severity" : "info"
}
]
} ,
{
"name" : "PipelineStrip" ,
2026-06-30 09:53:59 +02:00
"status" : "ok" ,
"tag" : "wn-pipeline" ,
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
"issues" : [
{
2026-06-30 09:53:59 +02:00
"kind" : "prop-extra" ,
"prop" : "stages" ,
"detail" : "on <wn-pipeline> (attribute 'stages'), not in IR contract." ,
"severity" : "info"
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
}
]
} ,
{
"name" : "Sidebar" ,
2026-06-30 09:53:59 +02:00
"status" : "ok" ,
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
"tag" : "wn-sidebar" ,
"issues" : [
{
"kind" : "prop-missing" ,
"prop" : "current" ,
"detail" : "in IR (attribute 'current'), absent on <wn-sidebar>" ,
2026-06-30 09:53:59 +02:00
"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."
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
} ,
{
"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." ,
2026-06-30 09:53:59 +02:00
"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."
feat(adapter): Lit component scaffold + drift report (WHYNOT-WP-0002 T07)
Extend make adapt-lit beyond tokens: parse src/elements/*.js, compare each IR
component contract against its <wn-*> element, and emit per-component drift
reports + a machine roll-up (adapters/lit/drift/), with write-once stubs
(adapters/lit/stubs/) for genuinely new components. Never overwrites
hand-authored sources.
- Severity split: actionable drift (prop-missing, attribute-mismatch,
variant-axis-missing, tag-mismatch) gates with exit 3; non-portable + prop-extra
are informational (the IR carries React style/onClick; Lit is richer than the
minimal designbook) and don't gate.
- Current state: 7 ok, 3 actionable drift for human triage — PipelineStrip
(wn-pipeline-strip vs hand-authored wn-pipeline rename), PageHeader (actions is
a slot, not a prop), Sidebar (IR 'current' axis absent on the element).
- _report.json reuses generatedAt/irRef when drift is unchanged (no git churn).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:03:22 +02:00
} ,
{
"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"
}
]
}
]
}