```python
def carve_shift(start: int, end: int, span: int, rest: int, least: int) -> list:
    if not all(isinstance(i, int) for i in [start, end, span, rest, least]):
        raise ValueError("All arguments must be whole numbers")
    if start >= end:
        raise ValueError("Start must precede end")
    if span < 1 or rest < 1:
        raise ValueError("Span and rest must be at least 1")
    if least < 1 or least > span:
        raise ValueError("Least must be between 1 and span, inclusive")

    stretches = []
    current_start = start
    while current_start + span + rest < end:
        stretch_end = min(current_start + span, end)
        if stretch_end - current_start >= least:
            stretches.append((current_start, stretch_end))
            current_start = stretch_end + rest
        else:
            break

    if current_start + span < end and end - current_start >= least:
        stretches.append((current_start, end))

    return stretches
```