```python
def carve_shift(start: int, end: int, span: int, rest: int, least: int) -> list:
    """
    Carve a shift into work stretches based on given parameters.

    :param start: The beginning of the shift (inclusive).
    :param end: The end of the shift (exclusive).
    :param span: Maximum length of each work stretch.
    :param rest: Length of the rest between work stretches.
    :param least: Minimum length of a kept work stretch.
    :return: List of [from, to) pairs representing the work stretches.
    """
    if not all(isinstance(a, int) for a 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 or least > span:
        raise ValueError("Invalid values for span, rest, and least.")

    stretches = []
    current_from = start

    while current_from < end:
        stretch_length = min(span, max(least, end - current_from))
        stretches.append((current_from, current_from + stretch_length))
        current_from += stretch_length + rest

    return stretches
```