```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 target
    
    if current + step > target:
        return target
    
    return current + step

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:
        raise ValueError("Start cannot be greater than target.")
    
    plan = []
    current = start
    
    while current <= target:
        plan.append(current)
        current += step
    
    return plan
```