The fix — /goals as a first-class registry, mirroring /blog and /sama Same shape. Same pattern. No new abstractions. Each /goal lands as goals/<slug>.md, registered in ALL_GOALS, served at /goals/<slug>. /blog (existing) — the empirical chain's narrative — FILES content/blog/<slug>.md REGISTRY src/a31_blog.ts ALL_POSTS: BlogEntry[] ROUTES /blog /blog/<slug> IN SITEMAP ✓ ALL_POSTS → /blog/<slug> with lastmod = post.date /sama (existing) — the discipline pages — FILES content/sama/<slug>.md REGISTRY src/a31_sama.ts ALL_SAMA: SamaDiscipline[] ROUTES /sama /sama/<slug> IN SITEMAP ✓ ALL_SAMA → /sama/<slug> /goals (NEW) — what produced everything — FILES goals/<slug>.md + YAML frontmatter REGISTRY src/a31_goals.ts ALL_GOALS: GoalEntry[] ROUTES /goals /goals/<slug> IN SITEMAP ✓ ALL_GOALS → /goals/<slug> merge_sha for git-SHA lookup Why this is mechanically SAMA v2: Identical shape to /blog and /sama — same Layer 0 (registry), Layer 1 (frontmatter parser), Layer 3 (handler + routes). No new abstractions. No new conventions. The empirical chain absorbs the /goal artifact without growing. https://tdd.md