```python
import re


def parse_option(segment: str) -> list:
    key, eq, raw = segment.partition("=")
    if not eq or re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*", key) is None:
        raise ValueError("malformed option segment: " + segment)
    if len(raw) >= 2 and raw.startswith('"') and raw.endswith('"'):
        raw = raw[1:-1]
    return [key, raw]


def scan_pairs(text: str) -> list:
    if not isinstance(text, str):
        raise ValueError("input must be a string")
    if text == "":
        return []
    
    pairs = []
    current_key = None
    buffer = ""
    quote_in_progress = False
    
    for char in text:
        if char == '"':
            if quote_in_progress:
                # End of quoted value
                raw_value = buffer.strip('"')
                if current_key is not None and [current_key, raw_value] in pairs:
                    raise ValueError("repeated key: " + segment)
                pairs.append([current_key, raw_value])
                current_key = None
            else:
                # Start of quoted value
                quote_in_progress = True
        elif char == ';':
            if not quote_in_progress and buffer != "":
                # End of unquoted value
                pair = parse_option(buffer)
                if pair[0] is not None and [pair[0], pair[1]] in pairs:
                    raise ValueError("repeated key: " + segment)
                pairs.append(pair)
                buffer = ""
            elif quote_in_progress:
                # Append semicolon to quoted value
                buffer += ';'
        else:
            if quote_in_progress:
                # Append character to quoted value
                buffer += char
            else:
                # Append character to unquoted value
                buffer += char
    
    if quote_in_progress:
        raise ValueError("unterminated quote")
    
    for pair in pairs:
        if pair[0] is None:
            raise ValueError("missing key: " + segment)
    
    return pairs
```