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

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

  for (const delta of moves) {
    if (typeof delta !== 'number' || !Number.isInteger(delta)) {
      throw new Error('Move must be a non-zero integer.');
    }

    const [newPosition, cutShort] = clampMove(position, delta, width);
    position = newPosition;
    bumps += cutShort ? 1 : 0;

    if (visited.has(newPosition)) continue;
    visited.add(newPosition);
  }

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