```python
def run_patrol(width: int, start: int, moves: list) -> dict:
    """
    Walks a patrol bot through a corridor of width cells and returns the final cell,
    number of wall bumps, and distinct cells visited.
    """
    
    if not isinstance(width, int) or width <= 0:
        raise ValueError("Width must be a positive integer.")
    
    if not isinstance(start, int) or start < 0 or start >= width:
        raise ValueError("Start must be an integer inside the corridor.")
    
    if not isinstance(moves, list):
        raise ValueError("Moves must be a list of integers.")
    
    position = start
    bumps = 0
    visited = {start}
    
    for delta in moves:
        result = clamp_move(position, delta, width)
        
        if len(result) != 2:
            raise ValueError("Invalid move result from clamp_move.")
        
        final_position, is_wall_cut = result
        
        position = final_position
        bumps += int(is_wall_cut)
        visited.add(final_position)
    
    return {"position": position, "bumps": bumps, "visited": len(visited)}

def clamp_move(position: int, delta: int, width: int) -> list:
    """
    Applies one signed move to a position and returns the landing cell together with
    a flag indicating if a wall cut the move short.
    """
    
    if not isinstance(position, int):
        raise ValueError("Position must be an integer.")
    
    if not isinstance(delta, int):
        raise ValueError("Delta must be an integer.")
    
    if delta == 0:
        return [position, False]
    
    new_position = position + delta
    
    if new_position < 0 or new_position >= width:
        return [new_position, True]
    
    return [new_position, False]
```