Three dashes separate carousels, a blank line separates slides — and the parsing rules that stop an em dash in prose from splitting a deck.
--- on its own line separates carousels; a blank line separates slides.
parseBulk: normalise CRLF → split /^[ \t]*-{3,}[ \t]*$/m → trim, drop empties
→ split each on /\n\s*\n/ → title = nameFromHook(first line)"A --- B" on one line does not split, and neither does "Cut on motion - not on beat". Empty blocks are dropped.