```python
def clause_order(a: str, b: str) -> int:
    """Compare two clause marks numerically, segment by segment.
    
    Returns -1 if a < b, 1 if a > b, and 0 if a == b.
    Raises ValueError for invalid inputs.
    """
    def parse_mark(mark: str) -> list[int]:
        if not isinstance(mark, str):
            raise ValueError("Mark must be a string")
        if not mark:
            raise ValueError("Mark cannot be empty")
        
        parts = mark.split('.')
        result = []
        for part in parts:
            if not part:
                raise ValueError("Empty number segment found")
            if not part.isdigit():
                raise ValueError("Non-digit character found")
            # Check for leading zeros: "0" is valid, "00", "01", etc. are not
            if len(part) > 1 and part[0] == '0':
                raise ValueError("Leading zero found")
            result.append(int(part))
        return result

    try:
        parts_a = parse_mark(a)
        parts_b = parse_mark(b)
    except ValueError:
        raise

    min_len = min(len(parts_a), len(parts_b))
    
    for i in range(min_len):
        if parts_a[i] < parts_b[i]:
            return -1
        elif parts_a[i] > parts_b[i]:
            return 1
    
    # If all shared segments are equal, the shorter one comes first
    if len(parts_a) < len(parts_b):
        return -1
    elif len(parts_a) > len(parts_b):
        return 1
    
    return 0
```