{% extends "base.html" %} {# Content Security Policy. Each loosening from a strict 'self' baseline is documented here and mirrored in tests/e2e/fixtures/csp-allowed.json: - script-src 'unsafe-inline' : mkdocs-material inline init scripts. - style-src 'unsafe-inline' : mkdocs-material inlines critical CSS. - img-src data: : inlined SVG/data-URL icons. - connect-src https://api.github.com : mkdocs-material announce-bar release-version fetch. Phase 3 AS3 (F-CSP-ORPHAN-LOOSENINGS-01): removed the orphan loosenings `style-src https://fonts.googleapis.com` and `font-src https://fonts.gstatic.com` in concert with `theme.font: false` in mkdocs.yml. Spec 31's inverse CSP orphan check confirmed these origins were never the source of any loaded response — the loosenings were declared but unused. NOTE: `frame-ancestors` is intentionally NOT set via . Per the CSP spec, browsers ignore `frame-ancestors` when delivered via meta-CSP — it MUST be sent as an HTTP response header. GitHub Pages does not allow custom response headers (no _headers file, no .htaccess), so we ship a small inline JS frame-busting guard below as defense-in-depth. If hosting ever moves off GitHub Pages, add `frame-ancestors 'none'` as an HTTP header on the origin. #} {% block extrahead %} {# AS16 (F-DOCS-OG-TWITTER-CARDS-MISSING-01): OpenGraph + Twitter Card meta for link previews in Slack / Teams / LinkedIn. Without these, FSI-AgentGov links shared in customer or partner channels render as bare URLs - poor first impression for a regulated FS audience. Intentionally NO og:image: we don't ship a brand image asset, and Slack/Teams render text-only unfurls correctly. A placeholder PNG would be worse than no image. N1 (rubber-duck): guard the " — Site Name" suffix on the homepage where page.title == config.site_name to prevent "FSI Agent Governance Framework — FSI Agent Governance Framework" duplication. N2 (rubber-duck): if a future maintainer enables Material's `social` plugin in mkdocs.yml, REMOVE this block - the plugin auto-injects og:/twitter: meta and duplication will confuse Slack/Teams unfurl. The outer {% if page %} guard is required because MkDocs renders 404.html with page=None; without it, the build fails with "'None' has no attribute 'meta'". #} {% if page %} {% set _og_title = page.title|striptags %} {% if _og_title != config.site_name %} {% set _og_title = _og_title ~ " — " ~ config.site_name %} {% endif %} {% set _og_description = page.meta.description|default(config.site_description) %} {% endif %} {% endblock %} {% block announce %} Framework recently updated — View Changelog {% endblock %}