The [design]: block is a slot. The author declares it, a designer fills it with an image. The post doesn't care when the image arrives or who put it there. The slot is the contract.
[journey]: is the same pattern — the author fills their own slot. The mechanism is identical.
That means the [] notation is already a content protocol. Any named slot can be filled by whoever has write access to the right path:
[journey]:— the author's making-of notes[design]:— artwork from a designer[comments]:— reader responses fetched from GitHub Discussions[corrections]:— edits from an editor[translation]:— a contributor's translation[context]:— a curator linking related posts
The post defines what belongs here. Other people or systems fulfill the contract independently.
The good part: you don't have to implement all of this upfront. Empty slots are invisible. Add [comments]: to a post today and nothing breaks — there's just nothing there yet. Build the comments fetcher when you're ready. The slot waits.
Features arrive when the slot gets filled, not when the post gets written.