```python
def open_windows(span: str, booked: list[str]) -> str:
    def parse_time(time_str):
        hours, minutes = map(int, time_str.split(':'))
        return hours * 60 + minutes

    def format_time(minutes):
        hours = minutes // 60
        minutes %= 60
        return f"{hours:02}:{minutes:02}"

    if not span or not all(appointment.startswith(span[:5]) for appointment in booked):
        raise ValueError("Invalid span or appointments")

    start, end = map(parse_time, span.split('-'))
    slots = [parse_time(app) for app in booked]
    slots.sort()

    free_slots = []
    current_end = 0

    for slot in slots:
        if slot > current_end:
            free_slots.append(format_time(current_end))
        current_end = max(current_end, slot + 1)

    if current_end < end:
        free_slots.append(format_time(current_end))

    return ','.join(free_slots) or "none"
```