Sitemap RFP entries now come from fetchGithubRfpsStrict, which throws when the Github listing or any individual RFP file cannot be read. Previously a failed fetch silently returned an empty list, so a Github outage shipped a sitemap with no RFP URLs while CI stayed green. The RFP pages keep the lenient loader and still degrade to an empty listing.
The static export smoke test derives RFP routes from the exported HTML instead of making a second Github call, which removes the build-time vs check-time race and makes the check fully offline.
Technology stack pages read the parent /technology-stack page copy for the parent breadcrumb name, instead of deriving it from the child page's own hero eyebrow.
Organization @id and url use the normalised site origin, and the structured data tests derive their base URL from siteConfig rather than hardcoding logos.co.
- node-programme-page-contract: allow the signup roles set to grow (e.g.
Activist) while still requiring the core Node operator/Builder roles,
instead of pinning an exact two-item list
- static-export-smoke: derive expected RFP routes from fetchGithubRfps, the
same source the RFP route's generateStaticParams uses, so expected pages
match the exported pages; skip RFP detail routes in the sitemap cross-check
since the sitemap is generated from the curated content package and
legitimately differs from the live GitHub listing