/** * page-shell.mjs · THE LUCREYA ARTICLE SCAFFOLD, AS A FUNCTION. * * ═══════════════════════════════════════════════════════════════════════════════════════════════ * ⛔ WHY THIS EXISTS AS A SEPARATE FILE. The first version of the reliability study was written as a * standalone HTML file with hand-rolled CSS and no site chrome. It rendered fine and was an orphan: * no `window.PAGE`, so no breadcrumb, no related articles and NO CAPTURE TAG; no `#site-header` or * `#site-footer`; no `data-table` class, so it silently opted out of the 2026-07-30 responsive table * heal; no `id` on any H2, so the honest-limits block could not be linked by name. * ★ `LATTICE-CONTENT-STACK.md` §RENDER states the lesson exactly: A PAGE CAN BE PERFECT CONTENT * INSIDE A BROKEN SHELL. Content gates and scaffold gates measure different things. * * ⚠️ ASSET STAMPS ARE COPIED FROM A SHIPPED ARTICLE, NOT INVENTED. `check-asset-stamps.js` compares * these against the built assets and a wrong digest blocks `safe-deploy` network-wide. If a stamp * changes, it changes here once rather than in every generator. * * ⛔ H2 ids ARE NOT DECORATION. R1b: "the honest-limits block must be linkable by name. An engine * that can cite /page#how-to-read-these-figures cites the caveats WITH the figure; a page whose * limits have no anchor can be quoted without them." Every heading here gets an id for that reason. */ export const ASSETS = { styles: '/styles.css?v=9f477032', overhaul: '/gtm-overhaul.css?v=aa459a66', config: '/site.config.js?v=02d09d8e', engine: '/site_engine.js?v=fe6166c5', extras: '/gtm-extras.js?v=a1867473', capture: '/lead-capture.js?v=ba4ce9d4', }; export const NAV = ` `; /** The inline drivers the scaffold contract requires: a frozen progress bar and an empty chapter * rail are both "markup present, feature dead", which is the failure R1 lists by name. */ export const DRIVERS = ``; /** * Wrap body content in the full lucreya article shell. * @param {object} o {slug,title,description,h1,deck,category,tag,readTime,emailTag,schema,style,body,breadcrumbTitle,capturedAt} */ export function shell(o) { const url = `https://lucreya.com/articles/${o.slug}`; const today = new Date().toISOString().slice(0, 10); const PAGE = { title: o.title, description: o.description, category: o.category, categoryEmoji: o.categoryEmoji || '\u{1F4CA}', tag: o.tag, slug: o.slug, type: 'article', date: today, readTime: o.readTime, emailTag: o.emailTag, datePublished: o.datePublished || today, dateModified: today, }; return ` ${o.title}
Published ${today} · ${o.readTime} · By Vincent Wesley Couey
${o.body}
${o.postArticle || ''}
${DRIVERS} `; }