build a table of contents from the document's headings

`::toc` renders through a `toc` fragment receiving level, text and the id
goldmark already assigns. The engine collects, the theme decides whether that is
a list, a sidebar or nothing — the reference theme emits a flat <ol> with a
level class per entry, so indentation is CSS rather than markup.

A theme cannot enumerate headings, because templates cannot parse HTML, so the
engine is the only thing that can supply them. Collection lives in ext; only the
Heading type and one Fragment field are core.

That is what needed the ceiling: CORE_LOC_MAX 2800 -> 2850, the second raise.
ADR-0041 said to read a second raise as evidence something belongs in ext, and
the test was applied rather than waived. feed.go and discover.go are the
features that should leave core, and they cannot, because an ext feature cannot
own a route until the extension registry exists — which the counter says buys
nothing yet. The thing that should move is blocked on a different decision, so
the honest fix was the ceiling and an ADR saying exactly that. When routes
become ownable, they leave and this comes back down.

Entry text is the heading's words with markup stripped: a link inside a link is
not markup a browser accepts. An entry whose heading has no id is skipped rather
than linked nowhere, and a page with no headings renders no nav at all.

core 2804/2850, ext 1825/2000, 34 gates green, 0 warnings.
This commit is contained in:
Claude Opus 5
2026-08-01 22:09:14 +06:00
committed by bdeshi
parent 78b8c51dff
commit 8bfacc7e98
15 changed files with 242 additions and 62 deletions
@@ -12,6 +12,8 @@ and appears in no listing. An included file cannot itself include — one level,
This bundle also has an `extras/` directory, so the theme offers a link to it at the foot of the page.
::toc
## The dialect
The page has a footnote of its own[^page], a table, a definition list and ~~a struck phrase~~.