```python
def run_patrol(width: int, start: int, moves: list) -> dict:
    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 position must sit inside the corridor")
    if not isinstance(moves, list):
        raise ValueError("moves must be a list")

    landed = [start]
    bumps = 0
    visited = set()

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

    return {
        "position": landed[-1],
        "bumps": bumps,
        "visited": len(visited) - 1
    }
```