/sitemap.xml — feature decomposition
One file per SAMA layer. Layer 2 stays empty.
Three files total — Pure data already exists; Core helper + Entry handler are the only new code.
Layer 3 · Entry
HTTP route — reads registries, calls Core helper, returns Response with XML body and Cache-Control
d21_app.ts → "/sitemap.xml"
↓ uses
Layer 2 · Adapter
— not required — registries are already in-process data; no DB, no network, no filesystem read at request time
(empty by design)
↓ uses
Layer 1 · Core
pure logic — takes Array<{loc, lastmod?}>, XML-escapes, returns sitemaps.org 0.9 urlset string
b32_sitemap.ts → renderSitemap()
↓ uses
Layer 0 · Pure
existing registries — single source of truth for every indexable URL on the site
ALL_POSTS · ALL_SAMA · ALL_GUIDES · BASE_URL
The Law (§1.2): imports flow downward only. d21 → b32 → a31. No upward edge, no sideways edge — the verifier rejects either.