Dynamic blocks
A dynamic block is an ordinary piece of Markdown that begins with a recognisable label. It lives wherever the text needs it — in the middle of a specification page, a guide, a note — and the block index finds every one, so a dynamic collection can gather them into a table without anyone moving a file.
The label grammar
A block's first run of bold text is its label. A label is an identifier
(AREA-N.), a kind word (Term:, Open:), or both. Everything until the
next blank line is the block's body; a following indented or quoted run may
extend it.
**WS-3.** A space folder is a bundle, and its declaration sits at the top
of it.
**Term: bundle.** One folder of Markdown files read as a whole — the unit a
project, a space and a library all are.
**Open: OKF-12.** Does a dynamic collection ever cache its members?
For an entity whose body is several blocks long, the label is a heading:
#### MECH-72 — dragging a row reorders the ranks
The gesture writes new `rank` values into the affected records and nothing
else…
Why this shape
- It reads as text. On GitHub and Obsidian these are bold sentences and headings — the way a legal text numbers its clauses. No fences, no JSON.
- It is findable. The pattern is a shape (
textclause with placeholders); the block index records label, kind, body and the page it stands on. - The identifier is the identity.
WS-3is minted once, never reused, and survives the paragraph moving to another page.
Gathering
A dynamic collection collects blocks the same way it collects documents:
its declaration is a direct collections/clauses.md file.
type: Collection
title: Clauses
itemType: Block
items:
mode: query
from: workspace
query:
version: 1
The table's rows are the blocks; opening a row goes to the block on its page. The label index supplies the matching block candidates. The declaration shape and strict query-v1 grammar are owned by Dynamic collections.