```python
def run_patrol(width: int, start: int, moves: list) -> dict:
    if not isinstance(moves, list):
        raise ValueError("moves must be a list")
    
    if width <= 0 or start < 0 or start >= width:
        raise ValueError(f"invalid width {width} or start {start}")
    
    position = start
    bumps = 0
    visited = {position}
    
    for move in moves:
        if not isinstance(move, int) or move == 0:
            raise ValueError(f"invalid move {move}")
        
        new_position, wall_bump = clamp_move(position, move, width)
        position = new_position
        bumps += wall_bump
        visited.add(position)
    
    return {"position": position, "bumps": bumps, "visited": len(visited)}

def clamp_move(position: int, delta: int, width: int) -> list:
    new_position = position + delta
    if new_position < 0:
        new_position = 0
    elif new_position >= width:
        new_position = width - 1
    
    return [new_position, (position != new_position)]
```