```python
"""A word-to-line index for a plain-text note."""

import re

WORD_RUN = re.compile(r"[a-z0-9]+")


def words_of_line(line: str) -> list:
    """Return maximal runs of ASCII letters and digits from a lowercased line."""
    return WORD_RUN.findall(line.lower())


def build_word_index(text: str) -> dict:
    """Map every word in the note to the strictly increasing list of line numbers."""
    if not isinstance(text, str):
        raise ValueError("text must be a string")
    index = {}
    rows = text.split("\n")
    for line_num, line in enumerate(rows, start=1):
        words = words_of_line(line)
        if not words:
            continue
        seen = set()
        for word in words:
            if word not in index:
                index[word] = []
            if word not in seen:
                index[word].append(line_num)
                seen.add(word)
    return index
```