```ts
export function runPatrol(width: number, start: number, moves: number[]): Record<string, number> {
  if (!Number.isInteger(width) || width <= 0) {
    throw new Error("width must be a positive integer");
  }
  if (!Number.isInteger(start) || start < 0 || start >= width) {
    throw new Error("start position must be an integer within the corridor");
  }
  if (!Array.isArray(moves)) {
    throw new Error("moves argument must be a list of numbers");
  }

  const visited = new Set<number>();
  let position = start;
  let bumps = 0;

  for (const delta of moves) {
    const [newPosition, cutShort] = clampMove(position, delta, width);
    if (cutShort) {
      bumps++;
    }
    visited.add(newPosition);
    position = newPosition;
  }

  return { position, bumps, visited: visited.size };
}
```