```python
def run_reservoir(capacity: int, start: int, ticks: list) -> dict:
    """
    Simulate an irrigation reservoir tick by tick.
    
    Parameters:
    - capacity: An integer representing the maximum capacity of the reservoir.
    - start: An integer representing the initial level of the reservoir.
    - ticks: A list of tuples, each containing an inflow and a demand.
    
    Returns:
    A dictionary with keys 'level', 'spilled', 'shortfall', and 'served'.
    """
    if not isinstance(capacity, int) or capacity <= 0:
        raise ValueError("Capacity must be a positive integer.")
    if not isinstance(start, int) or start < 0 or start > capacity:
        raise ValueError("Starting level must be an integer between 0 and the capacity.")
    if not all(isinstance(tick, tuple) and len(tick) == 2 for tick in ticks):
        raise ValueError("Ticks must be a list of two-item tuples.")
    if not all(isinstance(inflow, int) and isinstance(demand, int) and inflow >= 0 and demand >= 0 for inflow, demand in ticks):
        raise ValueError("Inflows and demands must be non-negative integers.")
    
    level = start
    spilled = 0
    shortfall = 0
    served = 0
    
    for inflow, demand in ticks:
        level += inflow
        if level > capacity:
            spilled += level - capacity
            level = capacity
        if demand > level:
            shortfall += demand - level
            level = 0
        else:
            served += demand
            level -= demand
    
    return {'level': level, 'spilled': spilled, 'shortfall': shortfall, 'served': served}
```