```ts
/// <reference path="clampMove.d.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 inside the corridor');
  }
  if (!Array.isArray(moves) || moves.some(move => !Number.isInteger(move))) {
    throw new Error('Moves must be a list of non-zero integers');
  }

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

  visited.add(position);

  for (const move of moves) {
    [position, bumps] = clampMove(position, move, width);
    visited.add(position);
  }

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