```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, inclusive.");
    }

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

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

    return stretches;
}
```