```python
"""Tape-measure spans: parse to inches, format canonically, and add."""

INCHES = {"yd": 36, "ft": 12, "in": 1}
ORDER = ("yd", "ft", "in")


def parse_span(text: str) -> int:
    if not isinstance(text, str):
        raise ValueError("Input must be a string")
    
    parts = text.split()
    if len(parts) == 0 or any(not part.strip() for part in parts):
        raise ValueError("Span is empty or contains only whitespace")
    
    units = set(part[-2:] for part in parts)
    if not units.issubset(ORDER):
        raise ValueError("Unknown units found or out of order")
    
    total_in_inches = 0
    for part in parts:
        value, unit = int(part[:-2]), part[-2:]
        total_in_inches += value * INCHES[unit]
    
    return total_in_inches


def format_span(inches: int) -> str:
    if not isinstance(inches, int) or inches < 0:
        raise ValueError("inches must be a non-negative integer")
    if inches == 0:
        return "0in"
    
    parts = []
    for unit in ORDER:
        value = inches // INCHES[unit]
        if value:
            parts.append(f"{value}{unit}")
            inches %= INCHES[unit]
    
    return " ".join(parts)


def add_spans(first: str, second: str) -> str:
    total_in_inches = parse_span(first) + parse_span(second)
    return format_span(total_in_inches)
```