```python
def carve_shift(start: int, end: int, span: int, rest: int, least: int) -> list:
    if not (isinstance(start, int) and isinstance(end, int) and isinstance(span, int) and isinstance(rest, int) and isinstance(least, int)):
        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 at least 1 and not greater than span")

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

    return stretches
```