```python
def run_till_session(events: list, prices: dict) -> dict:
    if not all(isinstance(v, int) and v > 0 for v in prices.values()):
        raise ValueError("All prices must be positive integers")

    state = {
        "items": [],
        "total": 0,
        "paid": 0,
        "change": 0,
        "status": "open"
    }

    cart = {}

    for event in events:
        if not isinstance(event, list) or len(event) != 2:
            raise ValueError("Each event must be a list of action and exactly one payload")

        action, payload = event

        if state["status"] == "paid" or state["status"] == "cancelled":
            raise ValueError("No events allowed after the session is paid or cancelled")

        if action not in ["scan", "void", "close", "pay", "cancel"]:
            raise ValueError("Unknown action")

        if action == "scan":
            if payload not in prices:
                raise ValueError(f"Item '{payload}' not found in price list")
            cart[payload] = cart.get(payload, 0) + 1
        elif action == "void":
            if payload not in cart or cart[payload] == 0:
                raise ValueError(f"Cannot void item '{payload}' as it is not in the cart or already at zero")
            cart[payload] -= 1
        elif action == "close":
            if not cart:
                raise ValueError("Cannot close an empty session")
            state["total"] = sum(prices[item] * quantity for item, quantity in cart.items())
            state["status"] = "payment"
        elif action == "pay":
            if not isinstance(payload, int) or payload <= 0:
                raise ValueError("Pay amount must be a positive integer")
            state["paid"] += payload
            state["change"] = max(0, state["paid"] - state["total"])
            state["status"] = "paid"
        else:  # action == "cancel"
            state["status"] = "cancelled"

    items_list = sorted([[item, cart[item]] for item in cart])
    return {
        "items": items_list,
        "total": state["total"],
        "paid": state["paid"],
        "change": state["change"]
    }
```