```
def scan_pairs(text: str) -> list:
    """
    Splits an options string into pairs where each pair is [key, value].
    Segments are separated by semicolons, except those between double quotes.
    Values may be empty and keys must be bare identifiers.
    Raises ValueError on invalid input or repeated keys.
    """
    if not isinstance(text, str):
        raise ValueError("Input must be a string.")
    
    pairs = []
    segment_start = 0
    in_quotes = False
    key = ""
    value = ""

    for i, char in enumerate(text):
        if char == '"':
            if in_quotes:
                # End of quoted value
                if segment_start + 1 < len(text) and text[segment_start + 1] == '=':
                    parse_option((key, value))
                    key = value = ""
                    segment_start = i + 2
                else:
                    raise ValueError("Unterminated quoted value.")
            else:
                # Start of quoted value
                in_quotes = True
                if segment_start < len(text) and text[segment_start - 1] == '=':
                    parse_option((key, value))
                    key = value = ""
                    segment_start = i + 1
        elif char == ';':
            if not in_quotes:
                # End of unquoted segment
                parse_option((key, value))
                key = value = ""
                segment_start = i + 1
        else:
            if in_quotes:
                value += char
            else:
                if char == '=' and not key:
                    raise ValueError("Key cannot be empty.")
                key += char

    # Final segment
    parse_option((key, value))

    return pairs


def parse_option(segment: str) -> list:
    """
    Parses a single option segment into [key, value].
    Raises ValueError if the segment is invalid.
    """
    parts = segment.split('=')
    if len(parts) != 2:
        raise ValueError("Invalid option format.")
    
    key, value = parts
    if not key.isidentifier():
        raise ValueError("Key must be a bare identifier.")

    return [key.strip(), value.strip()]
```