```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 must be a list of numbers.");
  }

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

  for (const delta of moves) {
    if (!Number.isInteger(delta) || delta === 0) {
      throw new Error("Move delta must be a non-zero integer.");
    }
    const [newPosition, isWallCut] = clampMove(position, delta, width);
    visited.add(newPosition);
    position = newPosition;
    bumps += isWallCut ? 1 : 0;
  }

  return {
    position,
    bumps,
    visited: visited.size - 1, // Subtract 1 to exclude the start cell
  };
}

export function clampMove(position: number, delta: number, width: number): [number, boolean] {
  const newPosition = position + delta;
  if (newPosition < 0) {
    return [0, true];
  }
  if (newPosition >= width) {
    return [width - 1, true];
  }
  return [newPosition, false];
}
```