```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 must sit inside the corridor")
    if not isinstance(moves, list):
        raise ValueError("moves must be a list")

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

    for delta in moves:
        result = clamp_move(position, delta, width)
        landed, cut_short = result

        if landed != position + delta:
            bumps += 1

        if landed == start and len(visited) > 2:
            return {"position": start, "bumps": bumps, "visited": list(visited)}

        visited.add(landed)
        position = landed

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