{% 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 %}