```python
def ramp_step(current: int, target: int, step: int) -> int:
    """
    Returns the next value moving from current toward target by at most step,
    never overshooting the target.
    """
    if step == 0:
        raise ValueError("Step cannot be zero.")
    if current > target:
        return max(target, current - step)
    elif current < target:
        return min(target, current + step)
    else:
        return current

def ramp_plan(start: int, target: int, step: int) -> list:
    """
    Returns every value visited going from start to target, both ends included.
    """
    if step == 0:
        raise ValueError("Step cannot be zero.")
    if start > target:
        return list(range(start, target - 1, -step))
    elif start < target:
        return list(range(start, target + 1, step))
    else:
        return [start]
```