```python
import re

def parse_option(segment: str) -> list:
    """Parse a key=value segment into [key, value] pair."""
    match = re.match(r'^([a-zA-Z_][a-zA-Z0-9_]*)=(.*?)(?:;|$)', segment)
    if not match:
        raise ValueError("Invalid option format")
    key, value = match.groups()
    if value.startswith('"') and not value.endswith('"'):
        raise ValueError("Unterminated quote in value")
    return [key, value.strip('"')]

def scan_pairs(text: str) -> list:
    """Split an options string into pairs of [key, value]."""
    if not isinstance(text, str):
        raise ValueError("Input must be a string")
    if not text:
        return []

    # Split outside double quotes
    stack = []
    result = []
    key_buffer = []
    in_quotes = False

    for char in text:
        if char == '"':
            in_quotes = not in_quotes
        elif char == ';' and not in_quotes:
            segment = ''.join(key_buffer).strip()
            key_buffer.clear()
            result.append(parse_option(segment))
        else:
            key_buffer.append(char)

    segment = ''.join(key_buffer).strip()
    if segment:
        result.append(parse_option(segment))

    # Check for repeated keys
    seen_keys = set()
    for key, _ in result:
        if key in seen_keys:
            raise ValueError("Repeated key")
        seen_keys.add(key)

    return result
```