```python
def span_merge(spans: list) -> list:
    """Merge overlapping or touching spans into a single ordered list."""
    if not spans:
        return []

    spans.sort(key=lambda s: (s[0], s[1]))

    merged = [list(spans[0])]
    for start, end in spans[1:]:
        if start <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], end)
        else:
            merged.append([start, end])

    return merged
```