```python
def run_till_session(events: list, prices: dict) -> dict:
    if not prices:
        raise ValueError("Price list cannot be empty")

    states = ['open', 'payment', 'paid', 'cancelled']
    state = states[0]
    cart = {}
    total = 0
    paid = 0

    for event in events:
        action = event[0]
        payload = event[1:] if len(event) > 1 else []

        if not isinstance(action, str) or not isinstance(payload, list):
            raise ValueError("Event must be a list with an action and optional payload")

        if state == 'paid' or state == 'cancelled':
            raise ValueError("Events cannot be processed after session is paid or cancelled")

        if action == 'scan':
            item = payload[0]
            if item not in prices:
                raise ValueError(f"Item '{item}' is not in the price list")
            cart[item] = cart.get(item, 0) + 1
        elif action == 'void':
            item = payload[0]
            if item not in cart or cart[item] == 0:
                raise ValueError(f"Cannot void item '{item}' as it is not in the cart or quantity is zero")
            cart[item] -= 1
            if cart[item] == 0:
                del cart[item]
        elif action == 'close':
            if not cart:
                raise ValueError("Cannot close session with an empty cart")
            total = sum(prices[item] * quantity for item, quantity in cart.items())
            state = states[1]
        elif action == 'pay':
            cents = payload[0]
            if not isinstance(cents, int) or cents <= 0:
                raise ValueError("Pay amount must be a positive integer")
            paid += cents
            if paid >= total:
                change = paid - total
                state = states[2] if paid == total else states[3]
        else:
            raise ValueError(f"Unknown action: {action}")

    return {
        'items': sorted([[item, quantity] for item, quantity in cart.items()], key=lambda x: x[0]),
        'total': total,
        'paid': paid,
        'change': change if state == states[3] else 0
    }
```