```python
def run_patrol(width: int, start: int, moves: list) -> dict:
    if not isinstance(moves, list):
        raise ValueError("moves must be a list")
    if not isinstance(width, int) or width < 1:
        raise ValueError("width must be a positive integer")
    if not isinstance(start, int) or not 0 <= start < width:
        raise ValueError("start must sit inside the corridor")

    position = start
    bumps = 0
    visited = {start}

    for move in moves:
        if not isinstance(move, int) or move == 0:
            raise ValueError("a move must be a non-zero integer")
        new_position, bumped = clamp_move(position, move, width)
        if bumped:
            bumps += 1
        position = new_position
        visited.add(position)

    return {"position": position, "bumps": bumps, "visited": len(visited)}
```