Song of Solomon had no verses
I opened /read/song-of-solomon/1 and got a perfectly normal page: correct slug, correct chapter count, HTTP 200. The scripture panel was empty. Proverbs, Ecclesiastes, and Isaiah on either side loaded fine. MongoDB had 43 chunks for the book. The text was there. The query just could not find it.
One book, centuries of English titles
This is not a data pipeline failure. It is a naming fork that runs through Bible translation, Protestant print culture, and how English readers learned to say book names out loud. The Hebrew title is a superlative: the greatest song, not a song about Solomon. English later named the book after the king named in its opening line, and that KJV-era label stuck hard enough that an LLM helping me scaffold bible-structure.json reached for it without thinking.
| Source | English title | Why it matters here |
|---|---|---|
| Hebrew | שִׁיר הַשִּׁירִיםShir Hashirim | Literally "Song of Songs." Hebrew repeats a word for the superlative, the same pattern as "holy of holies." The book never titles itself after Solomon. |
| KJV (1611) | Song of Solomon | Protestant England fixed this name in English culture. The opening superscription names Solomon; the title followed. |
| ESV | Song of Solomon | Same KJV-era convention carried into modern evangelical publishing. Familiar, author-attributed, uncontroversial on a bookshelf. |
| NET | The Song of Songs | Translators chose a title closer to the Hebrew original. VerseSee uses this name in bible-structure.json, the book picker, and MongoDB chunk queries. |
Two layers, two naming traditions
VerseSee ended up with both names in production because two unrelated sources each made a reasonable choice. Chapter counts in bible-structure.json come from a KJV JSON file (scripts/generate-bible-structure.mjs). The LLM and I labeled the book the way most English readers know it: Song of Solomon. The scripture text in MongoDB was pre-processed from the NET Bible, which prints The Song of Songs. Neither side is wrong. They were never forced to agree until a reader tried to open chapter 1.
// bible-structure.json before the fix (KJV-influenced label)
"name": "Song of Solomon"
// MongoDB chunks collection (NET Bible text)
"book": "The Song of Songs"What actually broke
getChapterVerses looks up chunks with book.name from static metadata. MongoDB stores the NET title on every chunk and nested verse. Exact string equality, zero fuzzy matching, zero verses returned. No error thrown. Just a quiet empty chapter on an otherwise healthy route.
Of all 66 books, this was the only one where static metadata and chunk documents disagreed on the English name. A bug shaped like a footnote in translation history: KJV culture on one side, NET literalism on the other, and a string compare in the middle. Kind of perfect. The fix was to standardize on the NET title, The Song of Songs, in bible-structure.json and everywhere the picker and reader resolve book names.