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