```
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 argument must be a list")

    visited = set()
    bumps = 0
    current_position = start

    for delta in moves:
        landed, is_bump = clamp_move(current_position, delta, width)

        if landed == current_position and delta != 0:
            # If the move did not change position, it's a zero-move.
            continue

        visited.add(landed)
        bumps += int(is_bump)

        current_position = landed

    return {
        "position": current_position,
        "bumps": bumps,
        "visited": len(visited)  # Including the start position
    }
```