```ts
export function carveShift(start: number, end: number, span: number, rest: number, least: number): number[][] {
  if (!Number.isInteger(start) || !Number.isInteger(end) || !Number.isInteger(span) || !Number.isInteger(rest) || !Number.isInteger(least)) {
    throw new Error('All arguments must be whole numbers.');
  }
  if (start >= end) {
    throw new Error('Start must precede end.');
  }
  if (span < 1 || rest < 1) {
    throw new Error('Span and rest must be at least 1.');
  }
  if (least < 1 || least > span) {
    throw new Error('Least must be between 1 and span.');
  }

  const stretches: number[][] = [];
  let current = start;

  while (current + span < end) {
    const to = Math.min(current + span, end);
    if (to - current >= least) {
      stretches.push([current, to]);
      current += span + rest;
    } else {
      break;
    }
  }

  if (current < end) {
    stretches.push([current, end]);
  }

  return stretches;
}
```