```python
def run_patrol(width: int, start: int, moves: list) -> dict:
    """
    Simulate a patrol bot's movement in a corridor.

    :param width: The width of the corridor (positive integer).
    :param start: The starting position of the bot (integer within [0, width-1]).
    :param moves: A list of moves to be applied to the bot (list of integers).
    :return: A dictionary containing the final position, number of bumps, and visited cells.
    """
    if not isinstance(width, int) or width <= 0:
        raise ValueError("Width must be a positive integer.")
    if not isinstance(start, int) or start < 0 or start >= width:
        raise ValueError("Start position must be an integer within the corridor.")
    if not isinstance(moves, list):
        raise ValueError("Moves must be a list of integers.")

    position = start
    bumps = 0
    visited = {position}

    for delta in moves:
        result = clamp_move(position, delta, width)
        new_position, cut_short = result[0], result[1]
        if cut_short:
            bumps += 1
        position = new_position
        visited.add(position)

    return {
        "position": position,
        "bumps": bumps,
        "visited": len(visited) - 1  # Subtract 1 to exclude the start position from visited count
    }
```