A persistent, non-dismissible banner appears above the rendered article body, telling the reader in plain language that what they are reading is Abstract Content generated elsewhere and displayed here for their convenience. This is not just a UX courtesy: it is how the client wiki honours the CC-BY-SA cross-wiki re-use obligation for content authored on abstract.wikipedia.org, and the legal attribution requirement is the reason the banner is non-dismissible — the same rationale that applies to the non-dismissible attribution banner on GlobalUserPage renders. Banner copy has already been proposed by Design/Product and will be picked up from there rather than re-written in this milestone. The banner must render correctly on both desktop (Vector/Vector 2022) and mobile (Minerva) skins, must be localised through the normal i18n message pipeline with qqq documentation, and must be laid out as a slot that M2 can extend rather than a frozen component.
Implementation notes:
- Design the banner as an extensible slot rather than a closed component. M2 will reuse M1's rendering both in mainspace (for opted-in articles) and on the M1 special page itself (for sysops evaluating candidate topics), populating the slot with a sysop call-to-action that appears in two symmetric flavours: an "opt this topic in" shortcut on the special page, and a "remove this opt-in" shortcut on mainspace renders. Both are covered in the relevant M2 sub-bullet. Designing the banner with an extension point for additional role-specific controls from day one is cheap; retrofitting one later is not. The M1 build ships the slot with zero extensions populated; M2 is the bullet that fills it.
- Provide a secondary banner variant for the cache-miss cold-path and render-failure cases. A successful read straight from the durable cache gets the primary banner; a read that went through the cold-path fallback because the cache missed, or a render that failed entirely (the error page described under the QID-not-found bullet, or a fragment-generation error propagating from the orchestrator), gets a distinct secondary banner instead, framing the situation for the reader without dropping the provenance or licence obligations. Copy for the secondary banner has not yet been supplied by Design/Product and is tracked as an open dependency of this milestone.
Acceptance criteria:
- A non-dismissible banner renders above the article body on the special page, using the copy proposed by Design/Product.
- The banner renders correctly on Vector/Vector 2022 and on Minerva, verified by eye on each skin.
- The banner is localised through the normal i18n message pipeline with qqq.json documentation (the banana check enforces completeness at build time).
- The banner is implemented as an extensible slot; M2 will populate the slot with a sysop CTA without rewriting the banner component.
- A secondary banner variant exists for the cache-miss cold-path and render-failure cases; its copy is either supplied by Design/Product or tracked as an open dependency linked from this task.