```python
def carve_shift(start: int, end: int, span: int, rest: int, least: int) -> list:
    """
    Carve a shift into work stretches based on given constraints.
    
    Parameters:
    - start (int): The start of the shift.
    - end (int): The end of the shift (exclusive).
    - span (int): Maximum duration of each stretch.
    - rest (int): Duration of the rest between stretches.
    - least (int): Minimum duration of a kept stretch.
    
    Returns:
    - list: A list of half-open [from, to) pairs representing work stretches.
    """
    if not all(isinstance(arg, int) for arg 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 < 1 or least > span:
        raise ValueError("Span and rest must be at least 1, and least must be between 1 and span.")
    
    stretches = []
    current_start = start
    
    while current_start + least <= end:
        stretch_end = min(current_start + span, end)
        if stretch_end - current_start >= least:
            stretches.append([current_start, stretch_end])
        current_start += rest
    
    return stretches
```